簡體   English   中英

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

[英]Unable to run mongo container with replica set using docker-compose

這是我的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

如果您在腳本中執行的最后一個命令永不退出(即停止運行),則您的容器將繼續運行。 因此, while (true);do sleep 1; done while (true);do sleep 1; done是一種解決方法。

如果您想要一個可以在需要時關閉容器的解決方案,可以使用類似

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

因此,當您在命令行中說touch /tmp/stop ,它將停止使容器保持運行的循環。

您的啟動腳本不應初始化或監視副本集。 這些應該是手動任務。

您應該記住:

  • 嚴格來說,啟動副本集是一次性的工作; 一旦啟動,MongoDB服務在重新啟動后將繼續成為同一副本集的一部分。
  • 副本集通常包含多個應可互換的節點; 如果它們每個都在啟動時嘗試初始化副本集,則會拋出錯誤
  • 重新啟動服務是正常的,預期的行為; 例如,當您升級到下一個版本的MongoDB時,或者在重新啟動服務器主機的修補程序之后,或者在斷電之后
  • 如果您的腳本在每次啟動MongoDB服務時嘗試初始化已初始化的副本集,則會引發錯誤

我強烈建議您進行三處更改:

  1. 讓您的mongo容器僅運行mongo,而無需執行初始化和監視副本集的步驟。
  2. 如果要運行副本集,請以受控的手動方式仔細啟動它。 同上(如果要添加/刪除節點或重新配置)。
  3. 如果要監視副本集的運行狀況,請使用單獨的工具執行此操作。 讓mongo服務部門完成其日常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM