HEALTHCHECK 指令用于定义容器健康检测逻辑,通过定期执行命令并依据退出码(0为健康)更新 health_status;支持 NONE 禁用及带 --interval、--timeout、--start-period、--retries 等参数的 CMD 启用模式。

HEALTHCHECK 指令用于在 Docker 镜像中定义容器健康状态检测逻辑,让 Docker 守护进程能主动判断容器是否正常运行,而不是仅依赖进程是否存在。它不启动额外服务,而是定期执行一个命令,根据其退出码(0 表示健康,非 0 表示不健康)更新容器的 health_status 字段。
HEALTHCHECK 基本语法与关键参数
HEALTHCHECK 支持两种模式:禁用(HEALTHCHECK NONE)和启用(HEALTHCHECK [OPTIONS] CMD)。常用选项包括:
- --interval=30s:两次检查的间隔,默认 30 秒;太短会增加负载,太长可能导致故障发现延迟
- --timeout=3s:单次检查超时时间,超时即视为失败
- --start-period=40s:容器启动后等待多久才开始首次检查,给应用预留初始化时间
- --retries=3:连续失败多少次后将状态标记为 unhealthy
例如:HEALTHCHECK --interval=60s --timeout=5s --start-period=30s --retries=2 CMD curl -f http://localhost:8080/health || exit 1
选择合适探针命令的要点
探针命令必须轻量、快速、无副作用,且能真实反映应用核心功能是否就绪:
- Web 服务优先用
curl -f或wget --spider访问专用健康端点(如/health),避免访问主页面(可能缓存或重定向) - 数据库类应用可用对应客户端命令,如
mysqladmin ping -h localhost -u root --password=xxx,注意密码安全(建议用配置文件或环境变量传参) - 避免使用
ps aux | grep myapp这类依赖进程名的检查——进程存在不等于服务可用 - 命令必须在容器内可执行;若基础镜像没装
curl,需提前安装(如RUN apt-get update && apt-get install -y curl)
在 Dockerfile 中正确植入 HEALTHCHECK
HEALTHCHECK 应放在 Dockerfile 最后(除 CMD 和 ENTRYPOINT 外),确保它生效于最终镜像。它不会覆盖父镜像的 HEALTHCHECK,除非显式声明 NONE。
- 如果基础镜像已有 HEALTHCHECK 但不适合你的应用,开头加
HEALTHCHECK NONE清除它 - 推荐把健康检查脚本独立为文件(如
healthcheck.sh),COPY 进镜像并赋予执行权限,便于复用和测试 - 示例片段:
COPY healthcheck.sh /usr/local/bin/healthcheck.sh<br> RUN chmod +x /usr/local/bin/healthcheck.sh<br> HEALTHCHECK --interval=30s --timeout=5s CMD ["/usr/local/bin/healthcheck.sh"] - 构建后可用
docker image inspect your-image查看 Healthcheck 字段是否生效
验证与调试健康检查行为
运行容器后,用 docker ps 可看到 STATUS 列含 (healthy) 或 (unhealthy);更详细信息通过 docker inspect container-name 查看 State.Health。
- 手动触发一次检查:
docker exec container-name /usr/local/bin/healthcheck.sh,观察输出和退出码 - 模拟故障:临时停掉服务(如
docker exec -it container-name pkill -f server),观察健康状态是否在--retries × --interval后变为 unhealthy - 日志中不会自动记录健康检查过程,如需排错,可在脚本中添加
echo "$(date): check run" >> /var/log/health.log


















