healthcheck 指令用于定义容器健康检查机制,通过定期执行 cmd 命令并依据退出码(0为健康)更新状态;支持 --interval、--timeout、--start-period 和 --retries 等选项,推荐使用 exec 格式命令以避免 shell 解析问题,并需确保依赖可用、超时合理、端口可达。

HEALTHCHECK 指令用于告诉 Docker 如何判断容器是否正常运行,它会在容器启动后定期执行检查命令,Docker 会根据命令的退出状态(0 表示健康,非 0 表示不健康)更新容器的 Health 状态。
基本语法和必需参数
HEALTHCHECK 必须指定一个可执行命令,常用形式为:
HEALTHCHECK [OPTIONS] CMD command其中 CMD 后面跟的是 shell 命令或 exec 格式命令。关键选项包括:
-
--interval=DURATION:两次检查间隔,默认 30s(如
--interval=10s) -
--timeout=DURATION:单次检查超时时间,默认 30s(如
--timeout=3s) -
--start-period=DURATION:容器启动后等待多久再开始检查,默认 0s(建议设为应用冷启动所需时间,如
--start-period=30s) - --retries=N:连续失败多少次才标记为 unhealthy,默认 3 次
推荐写法:用 exec 格式避免 shell 解析问题
避免使用 HEALTHCHECK CMD curl -f http://localhost:8080/health || exit 1 这类 shell 形式(会启动额外的 /bin/sh 进程,且 exit 逻辑不可靠)。应改用 exec 格式:
CMD ["curl", "-f", "http://localhost:8080/health"]
这样更轻量、语义清晰,Docker 直接执行 curl,退出码由 curl 决定(-f 会让 curl 在 HTTP 错误码 ≥400 时返回非 0)。
适配不同服务类型的检查命令
根据服务类型选择合理、低开销的检查方式:
-
Web 服务(如 Nginx、Spring Boot):用
curl -f http://localhost:PORT/health或curl -I -f http://localhost:PORT/(仅检查响应头) -
数据库(如 MySQL):用
mysqladmin ping -h localhost -u root -p"$MYSQL_ROOT_PASSWORD" > /dev/null(注意密码安全,生产中建议用配置文件或 socket) -
无网络服务(如纯计算进程):检查进程是否存在或关键文件是否就绪,例如
ps aux | grep myapp | grep -q -v grep或test -f /tmp/app.ready -
自定义脚本:把检查逻辑写进
/healthcheck.sh,确保有执行权限,并在 HEALTHCHECK 中调用:CMD ["/healthcheck.sh"]
注意事项和常见坑
实际编写时要注意以下几点:
- 检查命令必须在容器内能直接运行——确认已安装依赖(如 curl、mysql-client),否则 HEALTHCHECK 会一直失败
- 不要用需要交互或长时间阻塞的命令;超时设置要小于 interval,否则可能堆积检查任务
- 如果基础镜像没开 80/443 等端口,但健康接口走其他端口,确保该端口未被防火墙或应用配置拦截
- 多个 HEALTHCHECK 指令时,只有最后一个生效;不能通过 FROM 继承父镜像的 HEALTHCHECK,需显式重写
- 可通过
docker inspect CONTAINER_NAME | jq '.State.Health'查看实时健康状态











