首页/云/Docker 容器速查/compose depends_on 启动依赖
Compose 编排55 条

compose depends_on 启动依赖

声明服务启动顺序:短语法只保证容器启动先后,长语法配 condition: service_healthy 才能真正等待依赖就绪。

Docker 容器速查云更新于 2026-10-13

depends_on 是什么

depends_on 声明服务之间的启动依赖。短语法只保证容器的启动先后顺序,长语法配合 condition 才能真正等待依赖就绪:等健康检查通过,或等一次性任务以退出码 0 结束。这是它最容易被误用的地方。

基本信息

短语法depends_on: [db],只按顺序启动容器
长语法condition: service_started / service_healthy / service_completed_successfully
前提service_healthy 要求被依赖服务定义了 healthcheck
方向只表示本服务依赖上游,不反向生效
循环依赖成环时 compose 报 dependency cycle detected 拒绝启动

典型使用场景

  • 应用启动前等数据库就绪:配 service_healthy,避免应用连不上数据库直接退出
  • 数据库迁移先于应用:用 service_completed_successfully 等迁移跑完再拉起应用
  • 本地开发时保证缓存、消息队列先起,减少启动初期的报错噪音
  • CI 里按依赖顺序起测试依赖服务,跑完统一 down 清理
  • 给依赖补上 healthcheck,把模糊的启动顺序问题变成可判断的就绪问题
  • 把服务拓扑显式写进文件,让 compose 文件顺带承担一部分架构说明的职责

示例

示例
services:
  api:
    image: app/api:1.4.2
    depends_on:
      migrate:
        condition: service_completed_successfully  # 等迁移任务成功结束
      db:
        condition: service_healthy                 # 等数据库检查通过
      cache:
        condition: service_started                 # 只要求容器已启动
  db:
    image: postgres:16-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 10

三种 condition 的含义

取值等待到什么程度适用场景
service_started容器已启动不要求就绪的弱依赖
service_healthy健康检查通过数据库、消息队列等需要就绪才能连
service_completed_successfully容器以退出码 0 结束数据库迁移、初始化脚本
短语法下容器启动了并不代表服务可用,应用启动握手失败的多数原因就在这里;改成 service_healthy 通常比在应用里堆重试更省事。
condition 只在 compose 本地启停时生效,编排进集群后依赖语义不同;应用自身仍应保留连接重试,覆盖依赖中途重启的情况。
depends_on 只作用于项目的启动阶段:docker compose restart 只重启指定服务,不会连带把它的上游一起拉起来,重启后仍要自己确认依赖状态。

易错点

  • 被依赖服务没有定义 healthcheck 时使用 service_healthy 会直接报错,先给依赖补上检查再改 condition
  • depends_on 只解决启动窗口那段时间,依赖后续挂掉不会自动处理,服务可用性还要靠重试与重启策略
  • 依赖成环时报 dependency cycle detected,环形结构要拆服务或引入中间组件来解决
  • 以为依赖挂了上游会自动重启:depends_on 不管运行期,自愈要靠 restart 策略与健康检查配合
  • 上游被手动 stop 过时项目状态是不完整的,排查启动顺序前先用 compose ps -a 把每个服务的真实状态看全

数据来源与参考

  • Docker 官方文档:Compose depends_on 参考(docs.docker.com/reference/compose-file/services)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌