为了使用mongo transaction,我在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,网络看起来很好。
顺便说一句,在我切换到副本集之前,它工作得很好。
有什么想法吗?这是与身份验证相关的问题吗?提前谢谢。
发布于 2020-09-04 16:14:05
好了,我设法解决了这个问题。
仔细阅读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 container启动后单独运行:
docker exec mongodb-host /bin/sh /root/mongodb_rs_init.sh然后它就起作用了。
https://stackoverflow.com/questions/63716307
复制相似问题