MongoDB 单节点副本集在用作独立容器后未在 podman pod 中正确初始化

问题描述 投票:0回答:0

我有一个访问 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
和应用程序的一些其他初始数据。
我使用以下脚本在 wsl 中使用 podman 启动 mongo-container:

# 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
的问题? 当我在第二个脚本中使用不同的卷时,它可以工作,但我没有相同的数据进行测试....

java mongodb docker podman replicaset
© www.soinside.com 2019 - 2024. All rights reserved.