Docker启动容器后运行mongorestore

6

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

我的 Dockerfile 如下:

FROM mongo:bionic
COPY ./db-dump/mydatabase/* /db-dump/

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

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并运行相同的命令时没有任何问题。但是,我尝试添加-h与容器名称或127.0.0.1一起使用,却没有任何区别。为什么这个命令不能连接,而在容器运行时它能够正常工作呢?

1
当您在docker compose文件中将mongorestore作为命令传递时,它会覆盖镜像的默认命令,因此数据库将永远不会启动。您应该从另一个容器中运行mongorestore。 - sriharip316
1个回答

13

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

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

[来源]

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

mongorestore -d mydatabase /db-dump

然后将它和转储文件放在一起挂载:

version: "3.1"
  
services:
  mongo:
    image: mongo:bionic
    ports:
      - "27017:27017"
    volumes:
      - ./mongorestore.sh:/docker-entrypoint-initdb.d/mongorestore.sh
      - ./db-dump:/db-dump

你甚至不需要一个Dockerfile。


谢谢,问题解决了!只有一个小问题,我不得不使用mongorestore -d mydatabase ./docker-entrypoint-initdb.d/db-dump而不是sh文件 - 看起来脚本是在根目录而不是entrypoint目录中运行的。可能是我的设置有些奇怪,但我把它添加在这里以防对其他人有所帮助。 - DrRelling
@DrRelling 谢谢,我已经使用绝对路径更新了答案。我使用了不同的路径,但应该可以正常工作。问题是因为这些脚本的工作目录与 /docker-entrypoint-initdb.d 不同。 - anemyte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接