容器启动后运行命令

时间:2018-06-09 15:52:14

标签: mongodb docker docker-compose

我正在尝试在docker容器启动后执行命令。
这是我的Dockerfile

FROM mysite:myport/mongo:3.6
EXPOSE 27017
ADD mongo.js /data/mongodb/scripts/

这是我的docker-compose.yml

mongo:
    image: test-mongo
    container_name: test-mongo
    hostname: mongo
    expose:
      - "27017"
    ports:
      - "27017:27017"
    command: mongo --eval load("/data/mongodb/scripts/mongo.js")   

docker-compose --no-ansi up返回我

Creating test-mongo ...
Creating test-mongo ... done
Attaching to test-mongo
test-mongo | MongoDB shell version v3.6.5
test-mongo | connecting to: mongodb://127.0.0.1:27017
test-mongo | 2018-06-09T15:46:50.229+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), rea
son: Connection refused
test-mongo | 2018-06-09T15:46:50.229+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
test-mongo | connect@src/mongo/shell/mongo.js:251:13
test-mongo | @(connect):1:6
test-mongo | exception: connect failed
test-mongo exited with code 1

我不明白如何在 mongodb启动后加载我的文件

2 个答案:

答案 0 :(得分:1)

通过在command中传递docker-compose.yaml,您覆盖 mongo图像的正常行为 - 因此mongo服务器永远不会启动。您通常处理此问题的方法是将脚本放入第二个映像,然后启动第二个容器作为docker-compose.yaml的一部分,该容器与mongo服务器建立网络连接。类似的东西:

version: "3"

services:
  mongo:
    image: mongo

  client:
    image: my-mongo-client
    restart: on-failure
    command: mongo --host mongo --eval load("/data/mongodb/scripts/mongo.js")

restart指令将导致客户端容器重新启动 自动失败,这是必要的,因为它可能会尝试 在mongo服务器可用于处理连接之前连接。

答案 1 :(得分:1)

如果您要做的只是初始化一个新数据库,例如创建一个新的架构并添加一个用户,则可以创建一个初始化脚本并将其加载到容器中。从Docker Hub documentation

  

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