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

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容器本身未正常启动。

解决方案

  1. 修正环境变量配置
    任选一种方式即可:
  • 将dev.env重命名为.env,和docker-compose.yml中的配置匹配
  • 把docker-compose.yml中所有的env_file: .env修改为env_file: dev.env
  1. 修正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
  1. 修复keyfile权限
    在EC2宿主机项目目录下执行以下命令调整keyfile权限:
chmod 600 ./.docker/mongodb/file.key
chown 999:999 ./.docker/mongodb/file.key

其中999是MongoDB容器默认mongodb用户的UID。

  1. 优化初始化脚本等待逻辑
    替换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}",
  1. 清理残留数据并重启服务
    执行以下命令清理之前启动产生的残留卷和容器:
docker-compose down -v

再重新启动服务:

docker-compose up -d

内容的提问来源于stack exchange,提问作者Gowmi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:06:04