无法使用docker-compose运行具有副本集的mongo容器

时间:2017-12-06 12:49:14

标签: mongodb docker docker-compose replicaset mongodb-replica-set

这是我的docker-compose文件:

version: '3'
services:

  mongo:
    hostname: mongo
    container_name: search_mongo
    image: mongo:latest
    volumes:
      - ./docker/local/persist/mongo:/data/db
      - ./docker/mongo:/opt/mongo
    ports:
      - "8884:27017"
      - "8885:27018"
    entrypoint: /opt/mongo/entrypoint_mongo.sh

  agent:
    build: .
    image: myapp_search:compose
    depends_on:
      - mongo

这是我的entrypoint_mongo.sh

#!/bin/bash
mongod --port 27018 --replSet rs0 --fork --syslog --smallfiles
mongo --port 27018 --eval "rs.initiate({_id : 'rs0', members : [{_id : 0, host : 'mongo:27018'}]})"
mongo --port 27018 --eval "while(true) {if (rs.status().ok) break;sleep(1000)};"

我面临的问题是: mongo容器正在成功执行所有步骤,但它以状态0退出。

mongo_1          | about to fork child process, waiting until server is ready for connections.
mongo_1          | forked process: 7
mongo_1          | child process started successfully, parent exiting
mongo_1          | MongoDB shell version v3.4.10
mongo_1          | connecting to: mongodb://127.0.0.1:27018/
mongo_1          | MongoDB server version: 3.4.10
mongo_1          | { "ok" : 1 }
mongo_1          | MongoDB shell version v3.4.10
mongo_1          | connecting to: mongodb://127.0.0.1:27018/
mongo_1          | MongoDB server version: 3.4.10
search_mongo exited with code 0

2 个答案:

答案 0 :(得分:1)

如果脚本上的最后一个命令永远不会退出(即停止运行),则容器会继续运行。所以,while (true);do sleep 1; done是一个修复。

如果您想要解决方案,可以在需要时关闭容器,可以使用类似

的内容

while (! test -e /tmp/stop); do sleep 1; done; rm /tmp/stop

因此,当你在命令行touch /tmp/stop说,它将停止那个使容器运行的循环。

答案 1 :(得分:0)

您的启动脚本不应初始化或监控replicaset;那些应该是手工任务。

你应该记住:

  • 启动副本集严格来说是一次性工作;一旦启动,MongoDB服务在重新启动时将继续作为同一副本集的一部分。
  • 副本集通常包含几个应该可互换的节点;如果他们每个人都试图在启动时初始化副本集,他们将抛出错误
  • 重启服务是正常的,预期的行为;例如,当您升级到MongoDB的下一个版本,或者在服务器主机的补丁需要重新启动或停电后
  • 如果您的脚本在每次启动MongoDB服务时尝试初始化已初始化的副本集,则会抛出错误

我强烈建议您进行三项更改:

  1. 让你的mongo容器只运行mongo,而无需启动和监控副本集的步骤。
  2. 如果您想要运行副本集,请以受控的手动方式小心地启动它;如果要添加/删除节点或重新配置,请同样使用。
  3. 如果要监视副本集的运行状况,请使用单独的工具来执行此操作;让mongo服务只是做它的普通工作。