docker inspect 不保存健康检查历史,仅显示当前状态和最近5次检查日志;需结合 docker logs、增强 healthcheck 脚本记录、或外部监控工具获取完整失败线索。
docker inspect 本身不会保存或显示健康检查的历史失败记录。它只能显示容器当前的健康状态(如 status、failingstreak、log 中最近几次检查结果),但这个日志非常有限——默认只保留最近 5 次健康检查的结果,且不区分成功/失败的详细时间戳或错误上下文。
如果你执行:
docker inspect <container-name-or-id></container-name-or-id>
然后查找 State.Health 字段,可能看到类似内容:
"Health": {
"Status": "unhealthy",
"FailingStreak": 3,
"Log": [
{
"Start": "2024-04-01T10:00:00.123456789Z",
"End": "2024-04-01T10:00:05.987654321Z",
"ExitCode": 1,
"Output": "curl: (7) Failed to connect to localhost port 8080: Connection refused\n"
},
...
]
}
但这只是循环缓冲区里的最后 N 条记录(N=5),旧记录会被覆盖,无法回溯更早的失败。
关键点:
Docker 引擎不持久化健康检查历史。docker inspect 不是日志查看器,它只反映当前快照。
如何获取更完整的健康检查失败线索?
1. 结合容器应用日志定位根本原因
健康检查失败往往源于应用自身异常(端口未监听、进程崩溃、依赖不可用等)。优先查容器 stdout/stderr:
- 运行
docker logs <container></container>查看应用启动和运行时输出 - 加
-t显示时间戳:docker logs -t <container></container> - 若应用写入文件日志(如
/var/log/app.log),需进入容器查看:docker exec -it <container> cat /var/log/app.log</container>
2. 在健康检查命令中主动记录失败详情
把健康检查脚本增强为“带日志记录”的版本(推荐):
- 修改
HEALTHCHECK指令,调用一个 shell 脚本而非裸命令 - 脚本中用
date >> /health.log和echo "fail: $output" >> /health.log记录每次检查结果 - 挂载宿主机目录(如
-v /host/health-logs:/health-logs)持久化这些日志
3. 使用外部监控或重试逻辑辅助诊断
Docker 健康检查本身不具备告警或归档能力,可借助:
- 定时脚本轮询
docker inspect ... | jq '.State.Health.Status'并写入时间序列日志 - Prometheus + cAdvisor:暴露容器健康状态指标,配合 Grafana 可视化失败趋势
- 编排工具增强:Kubernetes 的 Liveness Probe 失败会触发 restart,并在
kubectl describe pod中留下事件记录;Docker Swarm 服务更新时也会记录 health check failure 事件(docker service ps --no-trunc <service></service>)
总之,不要依赖 docker inspect 查历史失败——它不是日志系统。真正可靠的健康可观测性,需要从应用层记录、宿主机落盘、或引入专业监控链路。











