如何将Docker HEALTHCHECK健康检查状态输出到docker logs日志中
解决方案
原因说明
Docker 容器默认只会收集 PID 为1的主进程(也就是你配置的sh loop.sh进程)的标准输出/标准错误作为容器日志,HEALTHCHECK 命令是Docker守护进程独立启动的额外进程,它的输出默认不会被纳入容器日志体系,所以你看不到健康检查的echo内容。
可用配置方案
方案1:重定向健康检查输出到主进程标准输出(最简推荐)
直接修改Dockerfile中的HEALTHCHECK指令,将输出重定向到1号进程的标准输出文件描述符即可:
FROM alpine ADD . / # 核心修改:将健康检查的输出重定向到PID 1的stdout,stderr也一并重定向 HEALTHCHECK --interval=1s --timeout=30s --retries=3 CMD echo {'health':'healthy'} > /proc/1/fd/1 2>&1 CMD ["sh","loop.sh"]
原理:Linux系统中/proc/1/fd/1对应PID为1的主进程的标准输出,写入这个路径的内容会被Docker日志收集器直接捕获。
方案2:通过共享日志文件中转
如果你的环境禁用了/proc文件系统访问,可以用日志文件中转的方式:
- 修改loop.sh,增加后台同步打印健康日志的逻辑:
#!/bin/sh # 先创建日志文件 touch /var/log/health.log # 后台持续打印健康日志到标准输出 tail -f /var/log/health.log & while 1>0;do echo "1"; sleep 2; done;
- 修改Dockerfile的HEALTHCHECK指令,将输出写入共享日志文件:
HEALTHCHECK --interval=1s --timeout=30s --retries=3 CMD echo {'health':'healthy'} >> /var/log/health.log
内容的提问来源于stack exchange,提问作者john mich
相关产品推荐
相关产品推荐

