Docker Compose在EC2部署MongoDB集群出现容器重启连接被拒绝问题求助
问题根因
- 环境变量加载失败:你本地的环境变量文件名为
dev.env,但docker-compose.yml中配置的env_file值为.env,导致MongoDB启动所需的用户名密码、副本集名称等参数读取为空,服务启动失败。 - 健康检查逻辑错误:mongo1的健康检查使用
rs.status()判断状态,但副本集未初始化时该命令返回值为失败,Docker判定服务不健康会持续重启容器。 - keyfile权限不符合要求:MongoDB要求副本集所用的keyfile权限必须为600,且属主为mongodb用户,直接挂载本地文件时权限不满足会导致服务启动闪退。
- 初始化脚本等待逻辑不合理:mongosetup.sh写死等待30秒就尝试连接MongoDB,若服务未完全启动就发起连接会失败,触发setup容器重启,形成恶性循环。
- 主机名解析认知错误:宿主机/etc/hosts的配置仅作用于宿主机进程,Docker Compose同网络下的容器默认自带服务名解析能力,之前连接失败不是解析问题,是mongo1容器本身未正常启动。
解决方案
- 修正环境变量配置
任选一种方式即可:
- 将
dev.env重命名为.env,和docker-compose.yml中的配置匹配 - 把docker-compose.yml中所有的
env_file: .env修改为env_file: dev.env
- 修正mongo1健康检查逻辑
将mongo1服务的healthcheck.test配置修改为和mongo2、mongo3一致:
test: echo 'db.runCommand({serverStatus:1}).ok' | mongo admin -u $${MONGO_INITDB_ROOT_USERNAME} -p $${MONGO_INITDB_ROOT_PASSWORD} --quiet | grep 1
- 修复keyfile权限
在EC2宿主机项目目录下执行以下命令调整keyfile权限:
chmod 600 ./.docker/mongodb/file.key chown 999:999 ./.docker/mongodb/file.key
其中999是MongoDB容器默认mongodb用户的UID。
- 优化初始化脚本等待逻辑
替换mongosetup.sh中写死的sleep 30为循环检测逻辑,确保MongoDB启动完成后再执行初始化:
until mongo --host ${MONGODB1}:30001 -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} --eval "db.adminCommand('ping')" > /dev/null 2>&1 do echo "Waiting for mongo1 to be available..." sleep 5 done
同时将副本集配置的_id替换为环境变量,避免硬编码和配置不一致:
"_id": "${MONGO_REPLICA_SET_NAME}",
- 清理残留数据并重启服务
执行以下命令清理之前启动产生的残留卷和容器:
docker-compose down -v
再重新启动服务:
docker-compose up -d
内容的提问来源于stack exchange,提问作者Gowmi
相关产品推荐
相关产品推荐

