Docker健康检查失败不会自动重启容器,必须配合--restart策略(如unless-stopped或always)或上层编排系统(如Swarm)才能实现自愈;HEALTHCHECK仅标记状态,不触发重启。
docker 容器健康检查失败本身不会直接触发重启,必须配合正确的 restart 策略 才能实现自动恢复。
关键点在于:HEALTHCHECK 只负责把容器状态标记为 unhealthy;而 --restart 策略决定 Docker 是否以及如何响应这个状态(或退出事件)。
必须用 --restart=unless-stopped 或 --restart=always
on-failure 策略对健康检查失败无效——它只响应容器进程退出且退出码非零的情况。而健康检查失败时,容器进程仍在运行,只是状态变为了 unhealthy。
所以正确做法是:
-
--restart=unless-stopped:最常用,适合长期服务,Docker daemon 重启后也自动拉起,且能配合编排系统(如 Swarm)在检测到unhealthy后重建任务。 -
--restart=always:无论容器为何退出、甚至健康状态异常,都会尝试重启(注意可能造成频繁重启循环,需搭配合理检查参数)。
✅ 正确示例:
OpenClaw Docker Setup下载在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
docker run -d \ --restart=unless-stopped \ --health-cmd="curl -f http://localhost:8080/health || exit 1" \ --health-interval=30s \ --health-timeout=3s \ --health-retries=3 \ --health-start-period=40s \ my-app
单靠 Docker 引擎无法“因 unhealthy 自动重启”,需要上层协同
原生 Docker(非 Swarm/K8s)不会仅因 unhealthy 状态就 kill 并重启容器。它只是更新 .State.Health.Status 字段。要真正实现“自愈”,有以下几种路径:
-
Docker Swarm 模式下:服务任务(task)一旦被标记为
unhealthy,Swarm 调度器会自动终止该 task 并启动新实例。 -
外部脚本轮询监控:用
docker inspect检查Status字段,发现unhealthy就执行docker restart。# 示例片段 if [ "$(docker inspect -f '{{.State.Health.Status}}' myapp)" = "unhealthy" ]; then docker restart myapp fi - 接入 Prometheus + Alertmanager + webhook:通过监控指标触发自动化恢复流程。
避免“假失败”:参数设置要贴合实际
很多容器反复处于 unhealthy 状态,不是服务真坏了,而是健康检查太激进:
-
<strong>--start-period=40s</strong>:给 Spring Boot、Node.js 等慢启动应用留出初始化时间,此期间失败不计数。 -
<strong>--interval=30s</strong>:太短(如5s)易增加负载;太长(如5m)故障发现滞后。 -
<strong>--timeout=3s</strong>:确保检查命令本身不拖慢服务,超时即判失败。 -
<strong>--retries=3</strong>:连续 3 次失败才标为unhealthy,避免网络抖动误判。
验证是否生效
运行后,用这些命令确认配置已加载并观察行为:
# 查看健康配置是否生效
docker inspect myapp | grep -A 10 Health
# 实时查看状态(healthy / unhealthy / starting)
docker ps --format "table {{.Names}}\t{{.Status}}"
# 查看最近一次检查详情
docker inspect myapp | jq '.[0].State.Health'不复杂但容易忽略


















