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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:24:01