docker容器健康检查通过healthcheck指令定义,依据命令退出码(0=healthy,1=unhealthy)周期性检测服务真实可用性;需合理配置interval、timeout、start-period和retries参数,使用curl、nc或pg_isready等轻量命令探活,并避免进程检查、外部依赖等常见陷阱。
docker 容器的健康检查通过 healthcheck 指令在 dockerfile 中定义,它会在容器运行时周期性执行命令,根据退出码判断容器是否处于健康状态。关键不是“有没有服务”,而是“服务是否能正常响应请求”。
HEALTHCHECK 基本语法与参数含义
HEALTHCHECK 必须放在 Dockerfile 的最后(或至少在 CMD/ENTRYPOINT 之后),一个 Dockerfile 只能有一个生效的 HEALTHCHECK 指令。常用写法如下:
HEALTHCHECK [OPTIONS] CMD command
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- --interval=30s:两次检查间隔,默认 30 秒
- --timeout=3s:单次检查超时时间,超时即视为失败
- --start-period=40s:容器启动后等待多久才开始首次检查,避免应用未就绪就被误判
- --retries=3:连续失败几次才将状态设为 unhealthy
常见探针命令写法(按服务类型)
探针命令必须是容器内可直接执行的 shell 命令,推荐使用轻量、无依赖的工具(如 curl、wget、nc、pg_isready),避免调用复杂脚本或外部二进制。
-
HTTP 服务(如 Nginx、Spring Boot):
curl -f http://localhost:8080/actuator/health || exit 1
注意:-f让 curl 在 HTTP 状态码 ≥400 时返回非零退出码;路径应指向真实健康端点(如/health、/ping) -
TCP 端口连通性(如 Redis、MySQL):
nc -z localhost 6379 || exit 1
仅验证端口是否开放,不校验服务逻辑是否就绪,适合简单场景 -
数据库就绪检查(PostgreSQL):
pg_isready -U postgres -d mydb || exit 1
需确保容器内已安装postgresql-client,比单纯连端口更可靠 -
自定义脚本(需提前 COPY 进镜像):
COPY healthcheck.sh /healthcheck.sh && chmod +x /healthcheck.sh,再写HEALTHCHECK CMD /healthcheck.sh
健康状态怎么看 & 如何调试
容器运行后,可用 docker ps 查看 STATUS 列中的 (healthy) 或 (unhealthy);详细信息用 docker inspect CONTAINER_NAME | jq '.State.Health'。
- 如果状态一直是
starting,大概率是--start-period还没过完,或首次检查就失败了 - 检查日志:
docker logs --since 5m CONTAINER_NAME,确认探针命令本身是否报错(比如 curl 找不到命令、权限不足、路径错误) - 临时进入容器手动执行探针命令:
docker exec -it CONTAINER_NAME sh -c "curl -f http://localhost:8080/health",复现并定位问题
避坑提醒:容易被忽略的关键细节
-
不要用
ps或pidof检查进程是否存在——进程在但服务卡死、线程阻塞、连接池耗尽等情况无法识别,健康状态会误报 - 避免探针命令依赖网络或外部服务(如 ping 公网域名、调用第三方 API),否则会引入不稳定因素
-
HEALTHCHECK 不会自动重启容器,它只改变状态;需配合编排工具(如 Docker Swarm 的
restart-policy或 Kubernetes 的 livenessProbe)触发恢复动作 - 多阶段构建中,确保探针所需工具(curl、nc 等)在最终镜像里存在,否则 HEALTHCHECK 直接失败










