docker-compose 如何让服务 Y 等服务 X 就绪后再启动?

depends_on 配 condition: service_healthy 可让 Y 等 X 通过健康检查后启动;X 需定义 healthcheck。只控制顺序不等就绪是旧版行为。本文给出完整配置示例。

最佳实践
docker-compose 如何让服务 Y 等服务 X 就绪后再启动?封面

做法:用 depends_on 的条件形式——给被依赖服务(X)定义 healthcheck,依赖方(Y)写 depends_on: { X: { condition: service_healthy } },compose 会等 X 的健康检查通过后才启动 Y。只写列表形式的 depends_on: [X] 只保证启动顺序,不等就绪,数据库还没初始化完应用就连接失败的坑都出在这。

完整示例

services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 10

  app:
    build: .
    depends_on:
      db:
        condition: service_healthy

app 会等到 pg_isready 连续通过才启动。

三种 condition

写法 含义
condition: service_started 只等启动(默认行为,不等就绪)
condition: service_healthy 等健康检查通过
condition: service_completed_successfully 等一次性任务跑完退出(适合迁移/migrate 容器)

常见服务的健康检查写法

# MySQL
healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p$$MYSQL_ROOT_PASSWORD"]

# Redis
healthcheck:
  test: ["CMD", "redis-cli", "ping"]

# HTTP 服务
healthcheck:
  test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]

一次性初始化任务

数据库迁移这类"跑完就退"的,用完成条件:

  migrate:
    build: .
    command: python manage.py migrate
    depends_on:
      db:
        condition: service_healthy
  app:
    depends_on:
      migrate:
        condition: service_completed_successfully

观测云对照

启动顺序问题在日志里最显眼。 应用因数据库未就绪而反复重启的 CrashLoop,容器日志里都是连接拒绝;观测云采集容器事件与日志后,这类依赖时序故障一眼可辨,还能对异常重启次数告警。

常见问题(FAQ)

Q:老教程里的 wait-for-it.sh 还需要吗?
A:新版 compose 的 condition 机制已覆盖大部分场景;应用内做连接重试仍是兜底的健壮性要求(运行期数据库也可能重启)。

Q:restart: always 与健康检查的关系?
A:健康检查失败不会自动重启容器(那是 K8s liveness 的语义),compose 的 healthcheck 主要用于 depends_on 判断与状态展示。

Q:depends_on 影响 docker compose stop 的顺序吗?
A:停止按依赖反序进行,先停依赖方再停被依赖方。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台