容器启动后在 Docker 上运行 mongorestore

DrR*_*ing 7 mongodb mongorestore docker docker-compose

我正在尝试设置一个运行 MongoDB 的容器,该容器在启动时使用 mongorestore 填充数据。这个想法是快速建立一个用于测试和模拟的虚拟数据库。

我的 Dockerfile 如下所示:

FROM mongo:bionic
COPY ./db-dump/mydatabase/* /db-dump/
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml 看起来像这样:

version: "3.1"
  
services:
  mongo:
    build: ./mongo
    command: mongorestore -d mydatabase ./db-dump
    ports:
      - "27017:27017"
Run Code Online (Sandbox Code Playgroud)

如果我使用 运行此命令docker-compose up,它会暂停一段时间,然后收到一条错误消息:

error connecting to host: could not connect to server: server selection error: server selection timeout, current topology: { Type: Single, Servers: [{ Addr: localhost:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: connection() : dial tcp 127.0.0.1:27017: connect: connection refused }, ] }
Run Code Online (Sandbox Code Playgroud)

但是,在容器上打开 CLI 并运行完全相同的命令不会出现任何问题。我尝试添加-h容器的名称或 127.0.0.1,但没有什么区别。为什么容器运行后该命令可以正常工作,但无法连接?

ane*_*yte 14

有一个比覆盖默认命令更好的方法 - 使用/docker-entrypoint-initdb.d

当容器第一次启动时,它将执行具有扩展名的文件.sh以及.js/docker-entrypoint-initdb.d. 文件将按字母顺序执行。.js文件将由 mongo 使用 MONGO_INITDB_DATABASE 变量指定的数据库(如果存在)执行,否则进行测试。您还可以在脚本内切换数据库.js

[来源]

因此,您只需将该命令写入名为的文件中mongorestore.sh

mongorestore -d mydatabase /db-dump
Run Code Online (Sandbox Code Playgroud)

然后将其与转储文件一起安装在里面:

mongorestore -d mydatabase /db-dump
Run Code Online (Sandbox Code Playgroud)

您甚至不需要 Dockerfile。