Mongodb 容器启动后在Docker上运行mongorestore

Mongodb 容器启动后在Docker上运行mongorestore,mongodb,docker,docker-compose,mongorestore,Mongodb,Docker,Docker Compose,Mongorestore,我正在尝试设置一个运行MongoDB的容器,该容器在启动时使用mongorestore填充数据。其想法是快速建立一个虚拟数据库,用于测试和模拟 我的Dockerfile如下所示: FROM mongo:bionic COPY ./db-dump/mydatabase/* /db-dump/ version: "3.1" services: mongo: build: ./mongo command: mongorestore -d mydataba

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

我的Dockerfile如下所示:

FROM mongo:bionic
COPY ./db-dump/mydatabase/* /db-dump/
version: "3.1"
  
services:
  mongo:
    build: ./mongo
    command: mongorestore -d mydatabase ./db-dump
    ports:
      - "27017:27017"
docker-compose.yml如下所示:

FROM mongo:bionic
COPY ./db-dump/mydatabase/* /db-dump/
version: "3.1"
  
services:
  mongo:
    build: ./mongo
    command: mongorestore -d mydatabase ./db-dump
    ports:
      - "27017:27017"
如果我使用
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 }, ] }

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

有一种比重写默认命令更好的方法-使用
/docker entrypoint initdb.d

当容器第一次启动时,它将执行扩展名为
.sh
.js
的文件,这些文件位于
/docker entrypoint initdb.d
中。文件将按字母顺序执行
.js
文件将由mongo使用mongo_INITDB_数据库变量(如果存在)指定的数据库执行,或者测试其他文件。您还可以在
.js
脚本中切换数据库

[]

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

mongorestore -d mydatabase /db-dump
然后将其与转储文件一起装入:

版本:“3.1”
服务:
蒙戈:
图片:mongo:仿生
端口:
- "27017:27017"
卷数:
-./mongorestore.sh:/docker-entrypoint-initdb.d/mongorestore.sh
-./db转储:/db转储

您甚至不需要Dockerfile。

当您在docker compose文件中传递mongorestore as命令时,它会覆盖图像的默认命令,因此数据库将永远不会启动。您应该从其他容器运行mongorestore。谢谢,成功了!只有一件小事,我必须使用
mongorestore-d mydatabase./docker entrypoint initdb.d/db dump
来代替sh文件-看起来脚本是在根目录而不是entrypoint目录中运行的。可能是我的设置有一些奇怪的地方,但添加到这里只是为了防止它对其他人有帮助。@DrRelling谢谢,我已经用绝对路径更新了答案。我使用了不同的路径,但应该是相同的。问题是因为这些脚本的工作目录与
/docker entrypoint initdb.d
不同。