You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:13:15