[英]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.