我有一个访问 mongoDB 的 Java Spring-Boot 应用程序。因为我需要事务,所以将 mongoDB 设置为单节点副本集。
我有以下用于 mongoDB 的 Dockerfile:
#DockerfileMongo
FROM docker.io/mongo:6.0.1
COPY scripts/init-mongodb.js /docker-entrypoint-initdb.d/
RUN openssl rand -base64 756 > file.key
RUN chmod 400 file.key
RUN chown 999:999 file.key
init-mongodb.js
-文件创建一个非管理员用户dev
,密码为pass
和应用程序的一些其他初始数据。# run_mongo.sh
echo "# Creating image"
sudo podman build -t localhost/my-mongo:latest -f ./DockerfileMongo
echo "# Run Container"
sudo podman run -dt -p 27017:27017 --name my-mongo-container --hostname my-mongo-container \
-e MONGO_INITDB_ROOT_USERNAME=admin_user \
-e MONGO_INITDB_ROOT_PASSWORD=admin_pass \
-e MONGO_INITDB_DATABASE=developmentDB \
-v mongo-datadir:/data/db \
localhost/my-mongo:latest \
--port 27017 \
--keyFile file.key \
--replSet rs0 \
--bind_ip_all
对于测试和开发,此设置非常有效——如果需要,我可以启动和停止 mongoDB,并从我的 IDE 启动我的 java 应用程序。
我有第二个脚本启动我的 java-app 和 mongoDB 一起容器化:
# DockerfileJava
FROM docker.io/openjdk:17-jdk-slim
COPY target/my-java-app-*.jar may-java-app.jar
ENV MONGO-DB-ADRESS="mongodb://dev:pass@localhost:27017/?authSource=developmentDB"
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/my-java-app.jar"]
在使用
mvn clean package spring-boot:repackage
构建我的应用程序后,我正在尝试使用以下脚本与 mongoDB 一起启动 java 应用程序:
# run_app_with_mongo.sh
echo "# Creating images"
sudo podman build -t localhost/my-mongo:latest -f ./DockerfileMongo
sudo podman build -t localhost/my-java-app:latest -f ./DockerfileJava
echo "# Creating Pod"
sudo podman pod create --name my-pod -p 8081:8081 -p 27017:27017
echo "# Run Container"
sudo podman run -dt --pod my-pod --name my-mongo-container \
-e MONGO_INITDB_ROOT_USERNAME=admin_user \
-e MONGO_INITDB_ROOT_PASSWORD=admin_pass \
-e MONGO_INITDB_DATABASE=developmentDB \
-v mongo-datadir:/data/db \
localhost/my-mongo:latest \
--port 27017 \
--keyFile file.key \
--replSet rs0 \
--bind_ip_all
sleep 20
# waiting 20 seconds for mongo startup
sudo podman exec -it my-mongo-container bash -c "mongosh --host localhost:27017 -u admin_user -p admin_pass --eval \"rs.initiate()\""
sudo podman run -dt --pod my-pod -e MONGO-DB-ADRESS=mongodb://dev:pass@localhost:27017/?authSource=developmentDB --name my-java-app-container localhost/my-java-app:latest
当我使用第一个脚本时
run_mongo.sh
一切正常。然后在停止我的 mongo 容器并删除图像然后尝试运行第二个脚本run_app_with_mongo.sh
容器正在启动但我从我的 java 应用程序中收到以下消息:
INFO 1 --- [localhost:27017] org.mongodb.driver.connection:打开连接 [connectionId{localValue:1, serverValue:5}] 到 localhost:27017
INFO 1 --- [localhost:27017] org.mongodb.driver.cluster:监控线程成功连接到服务器,描述为 ServerDescription{address=localhost:27017, type=REPLICA_SET_GHOST, state=CONNECTED, ok=true, version=ServerVersion{ versionList=[6, 0, 1]},minWireVersion=0,maxWireVersion=17,maxDocumentSize=16777216,logicalSessionTimeoutMinutes=30,roundTripTimeNanos=3951055,setName='null',canonicalAddress=null,hosts=[],passives=[] , arbiters=[], primary='null', tagSet=TagSet{[]}, electionId=null, setVersion=null, lastWriteDate=null, lastUpdateTimeNanos=3660922456911}
查询失败
查询失败,错误代码 13436 和服务器本地主机上的错误消息“节点不处于主要或恢复状态”:27017
当我停止容器并删除卷并运行第二个脚本时一切正常。
如何重复使用相同的卷并解决
REPLICA_SET_GHOST
的问题?
当我在第二个脚本中使用不同的卷时,它可以工作,但我没有相同的数据进行测试....