容器启动后在 Docker 上运行 mongorestore

问题描述

我正在尝试设置一个运行 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 并运行完全相同的命令,但没有任何问题。我试过在容器名称或 127.0.0.1 中添加 -h,但没有任何区别。为什么这个命令在容器运行后工作正常时无法连接?

解决方法

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

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

[Source]

因此,您只需将该命令写入名为 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。