在 Docker 镜像构建时需用 HEALTHCHECK 指令声明健康检查,它是镜像层面的固定配置,语法为 HEALTHCHECK [OPTIONS] CMD command,支持 --interval、--timeout、--start-period、--retries 等参数,返回码 0 表示 healthy,1 表示 unhealthy,命令须轻量、无副作用且内置依赖工具。

在 Docker 镜像构建时设置健康检查(Health Check),需在 Dockerfile 中使用 HEALTHCHECK 指令。它不是容器运行时才配置的选项,而是镜像层面的声明,一旦镜像被构建,该检查逻辑就固化其中,所有基于此镜像启动的容器默认继承该健康检查行为(除非被 docker run --no-healthcheck 显式禁用或覆盖)。
HEALTHCHECK 指令语法与核心参数
HEALTHCHECK 有两类写法:禁用父镜像的检查,或定义新的检查命令。常用的是后者:
-
基本格式:
HEALTHCHECK [OPTIONS] CMD command -
关键选项:
-
--interval=DURATION:检查间隔,默认 30s(如--interval=10s) -
--timeout=DURATION:单次检查超时时间,默认 30s(如--timeout=5s) -
--start-period=DURATION:容器启动后等待多久再开始检查,默认 0s;对初始化慢的服务很重要(如--start-period=30s) -
--retries=N:连续失败多少次才标记为 unhealthy,默认 3 次
-
-
command 必须是 shell 命令或可执行程序,且返回码决定状态:
- 返回
0→ healthy - 返回
1→ unhealthy - 返回
2→ reserved(Docker 不使用,避免使用)
- 返回
常见健康检查命令写法示例
根据服务类型选择轻量、快速、无副作用的检查方式:
-
HTTP 服务(如 Nginx、API 服务):
HEALTHCHECK --interval=15s --timeout=5s --start-period=40s --retries=3 CMD curl -f http://localhost:80/health || exit 1
(注意:curl需在镜像中存在;-f确保非 2xx/3xx 时返回非零码) -
数据库客户端检查(如 MySQL):
HEALTHCHECK --interval=20s CMD mysqladmin ping -h localhost -u root -prootpass --silent || exit 1
(密码不建议硬编码,生产环境应结合 secret 或配置文件) -
简单端口连通性(慎用,不等于服务就绪):
HEALTHCHECK CMD nc -z localhost 8080 || exit 1
(nc同样需预装;仅证明端口开放,无法验证业务逻辑是否就绪) -
自定义脚本检查(推荐复杂逻辑):
先在镜像中放入/health.sh(记得RUN chmod +x /health.sh),再写:HEALTHCHECK CMD ["/health.sh"]
注意事项与最佳实践
健康检查不是“加了就行”,需结合实际场景设计:
- 检查命令必须足够轻量,避免加重容器负载或阻塞主进程
- 避免依赖外部服务(如远程 API、第三方 DB),否则健康状态不可靠
- 若基础镜像(如
nginx:alpine)已自带HEALTHCHECK,你的Dockerfile中再次声明会自动覆盖,无需额外禁用 - 可通过
docker inspect <container>查看健康检查配置和当前状态(字段State.Health) - 运行时可临时覆盖:
docker run --health-cmd="curl -f http://localhost:3000/ready" --health-interval=10s ...
只要在 Dockerfile 中正确定义 HEALTHCHECK,并确保命令在容器内可执行、语义准确,构建出的镜像就能被编排系统(如 Docker Swarm、Kubernetes,尽管 K8s 通常用自己的探针)或运维工具可靠识别健康状态。


















