首页/云/Docker 容器速查/compose healthcheck 字段
Compose 编排55 条

compose healthcheck 字段

在 compose 文件里给服务定义健康检查:test 命令、间隔、超时、重试与启动宽限期;健康状态也是 up --wait 与依赖等待的依据。

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

compose healthcheck 字段

healthcheck 为服务定义健康检查:测试命令、间隔、超时、重试次数与启动宽限期。健康状态既显示在 compose ps 里,也是 depends_on 的 condition: service_healthy 与 up --wait 的判定依据。

基本信息

字段test、interval、timeout、retries、start_period
关闭方式healthcheck: disable: true
test 形式CMD 直接执行、CMD-SHELL 交给 shell、NONE 继承镜像设置
状态显示compose ps 里的 healthy 与 unhealthy 标记
判定用途依赖等待与 up --wait 的完成条件

典型使用场景

  • 让上游服务真正等到依赖就绪再启动,配合 depends_on 的条件判断
  • 部署完成后确认服务进入可用状态,而不是只看容器在运行
  • 慢启动应用留足宽限期,避免初始化阶段被误判为故障
  • 巡检与告警按健康状态判断可用性,比查进程更贴近实际
  • 覆盖基础镜像自带的检查,换成贴合业务语义的探测
  • 排查服务已启动但一直不健康:核对检查命令在容器内是否存在

示例

示例
services:
  db:
    image: postgres:16-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]   # 容器内可执行的命令
      interval: 5s
      timeout: 3s
      retries: 10
      start_period: 20s                                # 启动宽限期
  api:
    image: app/api:1.4.2
    depends_on:
      db:
        condition: service_healthy

字段与取值建议

字段作用取值建议
test健康检查命令用镜像里确实存在的工具
interval检查间隔比业务响应慢一个量级即可
timeout单次检查超时略大于检查命令的正常耗时
retries连续失败次数结合 interval 决定判定延迟
start_period启动宽限期按冷启动时间设置
start_period 内的失败不计入重试次数,适合启动慢的应用;检查命令本身必须在镜像里真实存在,否则会一直不健康。
interval 设得太小会让日志与 CPU 开销上升,按应用特性定合理间隔,不要写成高频探测。
健康检查只影响状态标记与依赖等待,不会触发容器重启,自愈要靠重启策略或编排层来解决。
test 用 CMD 形式不经过 shell,重定向与管道这类语法会失效;需要用 shell 特性时写成 CMD-SHELL,或把检查逻辑放进一个脚本文件。

易错点

  • 检查命令依赖容器里没有的工具(Alpine 基础镜像没有 curl),服务会一直显示 unhealthy
  • 依赖服务没有 healthcheck 时使用 condition: service_healthy 会直接报错,先给依赖补上检查
  • start_period 设得太短,把初始化阶段算作失败,服务刚起来就被标记为不健康
  • 把检查写成探测下游依赖,一个组件抖动全体变红,健康检查应当只反映自身状态
  • 健康检查命令写得太重(如每次都做一次完整查询),在高负载时会额外加重服务负担,检查应当是轻量只读操作

数据来源与参考

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