这三个机制经常一起出现,但解决的是不同问题:

机制回答的问题
healthcheck服务现在能否正常响应?
restart容器进程退出后是否重启?
depends_on依赖服务达到什么状态后再启动?

一个完整的 Compose 片段

services:
  api:
    image: example/api:1.0
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
 
  db:
    image: postgres:17-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER}"]
      interval: 10s
      timeout: 3s
      retries: 5
      start_period: 20s

数组里的 CMD-SHELL 会经过 shell;$$ 用于把美元符号留给容器内执行。若不需要 shell 展开,可以使用 CMD 数组形式。

两个常见误区

第一,容器变成 unhealthy 时,Docker 不会仅因为健康检查失败就自动重启它。重启策略主要处理主进程退出。如果希望自愈,应用可在不可恢复时退出,或交给编排系统处理。

第二,普通 depends_on 只表达启动依赖,不保证依赖已经可用。需要等待就绪时,应为依赖配置健康检查,并使用 condition: service_healthy;应用自身仍应实现重试和超时,因为运行过程中依赖也可能再次不可用。

好的健康检查应快速、稳定、低成本,并真正覆盖服务对外提供能力所必需的路径。

参考:Compose healthcheckStartup order