Dockerfile HEALTHCHECK 是什么
HEALTHCHECK 在镜像里定义容器自检命令,Docker 按设定周期在容器内执行它:退出码为 0 视为健康,1 视为不健康,docker ps 的状态列会显示 healthy 或 unhealthy。有了它,编排与监控就能基于容器状态判断可用性,而不只是从外部探测端口——端口连通并不代表应用真的能处理请求。start-period 提供启动宽限,适合初始化较慢的服务。
基本信息
| 参数 | --interval 间隔、--timeout 超时、--start-period 启动宽限、--retries 连续失败阈值 |
|---|---|
| 退出码 | 0 健康;1 不健康;2 为保留值不推荐使用 |
| 禁用方式 | docker run --no-healthcheck;子镜像可用 NONE 覆盖 |
| 查看结果 | docker inspect 的 State.Health 含最近几次探测的输出与时间 |
| 启动宽限 | start-period 内的失败不计入 retries,适配慢启动应用 |
典型使用场景
- 慢启动应用(如 JVM 服务)配合启动宽限,避免初始化阶段被判定不健康
- 编排需要基于就绪状态决定何时接入流量,避免请求打到还没准备好的实例
- 多实例部署时区分『进程活着』与『服务真的可用』两种状态
- 服务需要内部组件初始化完成才可服务,用自检命令反映真实就绪程度
- 把健康状态接入监控与告警,让不健康从隐性问题变成可见信号
HTTP 自检示例
HTTP 自检示例
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 CMD curl -fsS http://127.0.0.1:8080/healthz || exit 1查看探测结果
查看探测结果
docker inspect -f '{{json .State.Health}}' myapp # 最近探测结果与输出
docker ps --format '{{.Names}} {{.Status}}' # 状态列会显示 healthy / unhealthy
# 探测输出会保留若干次,报错信息是定位健康检查失败原因的第一手材料探测方式对比
| 探测方式 | 实现手段 | 局限 |
|---|---|---|
| 端口连通 | 检查端口是否可连接 | 进程存活但业务异常时仍显示健康 |
| HTTP 接口 | 访问自带的探活接口并检查状态码 | 镜像内需存在 curl 或 wget 等工具 |
| 进程存活 | 按进程名检查是否存在 | 无法反映依赖状态与内部错误 |
| 应用自检命令 | 调用自带命令检查内部状态 | 要求应用提供此类命令 |
distroless 与 scratch 镜像里没有 shell 也没有 curl:健康检查要么调用镜像内已有的二进制,要么改写成 exec 形式,否则容器会一直处于不健康状态。
退出码只有 0 与 1 具有明确含义,2 属于保留值:自检脚本应统一用 0 表示健康、1 表示异常,其他取值的行为不明确,排查时容易产生困惑。