Docker Compose部署MongoDB副本集报错:未启用复制功能
MongoDB副本集搭建报错:This node was not started with replication enabled.
我正在搭建MongoDB副本集以启用Change Streams功能(socket.io MongoDB-Adapter依赖该功能),但启动容器时遇到错误导致服务终止。
当前配置
Docker Compose配置
db: build: dockerfile: images/Dockerfile_mongodb_dev command: ["--config", "/etc/mongo.conf"] ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example volumes: - ./mongodb/mongo.conf:/etc/mongo.conf:ro - ./mongodb/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro - ./data-dev/db:/data/db
Docker镜像内容
FROM mongo:7.0.6 RUN echo "KEYFILE_CONTENT" >> /etc/mongodb-keyfile && chown mongodb:mongodb /etc/mongodb-keyfile && chmod 400 /etc/mongodb-keyfile
mongo.conf配置
security: authorization: enabled keyFile: /etc/mongodb-keyfile net: bindIpAll: true port: 27027 replication: replSetName: rs0
初始化脚本(mongo-init.js)
rs.initiate({ _id: 'rs0', members: [ { _id: 0, host: 'db:27017' } ] });
报错信息
MongoServerError: This node was not started with replication enabled.
解决方案
1. 修正端口不一致问题
mongo.conf中配置的端口是27027,但Docker Compose的端口映射、初始化脚本中使用的都是27017,这会导致MongoDB监听的端口与副本集初始化时指定的端口不匹配,进而无法正确加载复制配置。
修改mongo.conf的net.port为27017:
net: bindIpAll: true port: 27017
2. 确保复制配置正确加载
验证Docker Compose中command参数是否正确指定了配置文件,当前的["--config", "/etc/mongo.conf"]是正确的,同时确认volumes中./mongodb/mongo.conf:/etc/mongo.conf:ro的挂载路径无误,保证容器能读取到正确的配置。
3. 验证密钥文件有效性
确保Dockerfile中的KEYFILE_CONTENT是MongoDB副本集要求的有效密钥内容(需为PEM格式,长度在6-1024字节之间),且权限设置正确(chmod 400、所有者为mongodb:mongodb),这部分当前配置是符合要求的,但需替换占位符为实际密钥。
4. 调整初始化脚本执行时机(可选)
如果初始化脚本执行过早,MongoDB尚未完全启动并加载复制配置,可在脚本中添加等待逻辑:
function waitForMongoReady() { try { rs.status(); return true; } catch (err) { print("等待MongoDB服务启动..."); sleep(1000); return waitForMongoReady(); } } waitForMongoReady(); rs.initiate({ _id: 'rs0', members: [ { _id: 0, host: 'db:27017' } ] });
内容的提问来源于stack exchange,提问作者Mischa Binder
相关产品推荐
相关产品推荐

