docker-compose up无法启动mongo-express单独启动正常是什么原因?
故障原因
Docker Compose的默认启动逻辑只控制容器的启动顺序,不会等待对应服务的内部进程完全初始化完成才启动下游服务。
你遇到的情况就是mongodb容器虽然已经进入running状态,但MongoDB本身的初始化流程(权限配置、端口监听、数据目录加载)还没走完,此时提前启动的mongo-express发起连接就会收到ECONNREFUSED错误。而mongo-express镜像默认没有内置连接失败重试逻辑,连接失败就直接正常退出,所以你会看到状态为exited (0)。等你手动启动mongo-express的时候,mongodb已经完成了初始化,所以连接可以成功。
配置调整方案
有两种常用的调整方案,任选其一即可:
方案1:添加健康检查(更推荐)
给mongodb服务添加健康检查规则,主动检测MongoDB服务是否真正可用,再让mongo-express等待mongodb健康检查通过后再启动。
修改后的docker-compose.yaml对应配置如下:
version: '3' services: my-app: image: maryo/my-app:1.2 ports: - 3000:3000 mongodb: image: mongo ports: - 27017:27017 environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password volumes: - mongo-data:/data/db # 新增健康检查配置 healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')", "-u", "admin", "-p", "password"] interval: 5s timeout: 5s retries: 3 mongo-express: image: mongo-express ports: - 8080:8081 environment: - ME_CONFIG_MONGODB_ADMINUSERNAME=admin - ME_CONFIG_MONGODB_ADMINPASSWORD=password - ME_CONFIG_MONGODB_SERVER=mongodb # 新增依赖配置,指定等待mongodb健康检查通过 depends_on: mongodb: condition: service_healthy volumes: mongo-data: driver: local
方案2:配置自动重启策略
如果不需要严格控制启动顺序,也可以给mongo-express配置重启规则,连接失败退出后自动重启,直到mongodb服务就绪可以正常连接:
mongo-express: image: mongo-express restart: always ports: - 8080:8081 environment: - ME_CONFIG_MONGODB_ADMINUSERNAME=admin - ME_CONFIG_MONGODB_ADMINPASSWORD=password - ME_CONFIG_MONGODB_SERVER=mongodb depends_on: - mongodb
修改配置后重新执行docker-compose -f docker-compose.yaml up即可实现三个服务正常同时启动。
内容的提问来源于stack exchange,提问作者Maryo David
相关产品推荐
相关产品推荐

