Docker Compose部署MongoDB副本集:副本集名称异常为--auth问题排查
Docker Compose部署MongoDB副本集:副本集名称异常的原因与解决
问题场景
尝试通过Docker Compose部署MongoDB 6副本集,为处理密钥文件的权限与归属问题重写了entrypoint,但发现副本集名称变为--auth而非预期的rs0,配置如下:
services: mongo1: image: mongo:6 container_name: mongo-rs-primary environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_DATABASE: admin volumes: - ./_docker/volumes/mongo1:/data/db - ./_docker/mongo-rs-key:/data/mongo-rs-key ports: - 27017:27017 entrypoint: - bash - -c - | chmod 400 /data/mongo-rs-key chown 999:999 /data/mongo-rs-key exec docker-entrypoint.sh $$0 command: --replSet rs0 --keyFile /data/mongo-rs-key --port 27017 mongo2: image: mongo:6 container_name: mongo-rs-replica1 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_DATABASE: admin volumes: - ./_docker/volumes/mongo2:/data/db - ./_docker/mongo-rs-key:/data/mongo-rs-key ports: - 27018:27018 entrypoint: - bash - -c - | chmod 400 /data/mongo-rs-key chown 999:999 /data/mongo-rs-key exec docker-entrypoint.sh $$0 command: --replSet rs0 --keyFile /data/mongo-rs-key --port 27018 mongo3: image: mongo:6 container_name: mongo-rs-replica2 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_DATABASE: admin volumes: - ./_docker/volumes/mongo3:/data/db - ./_docker/mongo-rs-key:/data/mongo-rs-key ports: - 27019:27019 entrypoint: - bash - -c - | chmod 400 /data/mongo-rs-key chown 999:999 /data/mongo-rs-key exec docker-entrypoint.sh $$0 command: --replSet rs0 --keyFile /data/mongo-rs-key --port 27019
原因分析
问题出在exec docker-entrypoint.sh $$0这行代码:
- 在
bash -c的执行上下文里,$0代表的是bash进程本身(即字符串bash),而非Docker Compose中command字段定义的参数列表 - 这导致
docker-entrypoint.sh只接收到bash作为唯一参数,完全没有拿到--replSet rs0 ...这些关键配置 - 由于环境变量中设置了
MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD,MongoDB自动启用了--auth模式,但缺少副本集配置,最终出现副本集名称异常的问题
解决方法
方法1:完整传递命令参数
将entrypoint中的最后一行改为exec docker-entrypoint.sh "$@","$@"会把bash -c接收的所有位置参数(也就是command字段的内容)完整传递给docker-entrypoint.sh:
entrypoint: - bash - -c - | chmod 400 /data/mongo-rs-key chown 999:999 /data/mongo-rs-key exec docker-entrypoint.sh "$@"
方法2:直接整合命令到entrypoint
也可以把command的配置直接写入entrypoint脚本,避免参数传递的问题,每个服务对应自己的端口参数即可:
# mongo1的entrypoint示例 entrypoint: - bash - -c - | chmod 400 /data/mongo-rs-key chown 999:999 /data/mongo-rs-key exec docker-entrypoint.sh --replSet rs0 --keyFile /data/mongo-rs-key --port 27017
验证方法
修改配置后重启容器,进入任意MongoDB容器执行以下命令验证副本集状态:
mongosh -u root -p password --eval "rs.status()"
查看输出中set字段的值是否为rs0,确认配置生效。
内容的提问来源于stack exchange,提问作者Jiew Meng
相关产品推荐
相关产品推荐

