簡體   English   中英

從另一個 docker 容器連接到 Mongodb 副本集失敗

[英]Connect to Mongodb replica set from another docker container failed

為了使用 mongo 事務,我在 docker 中創建了一個獨立的副本集:

這是dockerfile:

FROM mongo:4.4-bionic
RUN echo "rs.initiate({'_id':'rs0','members':[{'_id':0,'host':'mongodb-host:27017'}]});" > /docker-entrypoint-initdb.d/replica-init.js
RUN cat /docker-entrypoint-initdb.d/replica-init.js
CMD [ "--bind_ip_all", "--replSet", "rs0"]

和命令行(我沒有使用 docker-compose):

docker run -d -p 27017:27017 --restart=always -e TZ=Asia/Shanghai --network mongo-network --name mongodb-host mongodb-image mongod --replSet rs0 --port 27017 --bind_ip_all

當我從獨立的 Java 應用程序(使用 spring 啟動數據)連接時,它工作正常,URI 如下:

spring.data.mongodb.uri=mongodb://localhost:27017/db_mongo?replicaSet=rs0

但是在我構建了我的應用程序並在 docker 中部署之后,我無法再連接到它,對於 URI 像:

spring.data.mongodb.uri=mongodb://mongodb-host:27017/db_mongo?replicaSet=rs0

我可以在這個容器內 ping mongodb-host,網絡看起來很好。

順便說一句,在我切換到副本集之前它工作正常。

有任何想法嗎? 這是與身份驗證相關的問題嗎? 提前致謝。

好的,我設法解決了這個問題。

仔細閱讀 mongodb docker 日志后,我注意到 rs.initiate() 執行時出現錯誤。 奇怪的是,這個錯誤只發生在我使用“mongodb-host”作為主機名時,可能是因為當時 docker 網絡還沒有准備好。

所以我為init寫了一個shell:

sleep 5
mongo --eval "rs.initiate({'_id':'rs0','members':[{'_id':0,'host':'mongodb-host:27017'}]})"

並在 docker 容器啟動后單獨運行:

docker exec mongodb-host /bin/sh /root/mongodb_rs_init.sh

然后它起作用了。

暫無
暫無

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

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