升级Docker 20.10.7后healthcheck.sh找不到致容器不健康如何解决
问题原因
- Docker 20.10.7 版本存在官方确认的健康检查功能回归Bug:该版本中容器健康检查进程的挂载命名空间与容器主进程不一致,导致健康检查进程无法读取部分存储在镜像下层的文件,而通过
docker exec进入容器或主进程访问时可以正常读取该文件,这是你遇到的概率最高的原因。该Bug已经在20.10.8及更高的Docker稳定版中修复。 - 脚本shebang行指定的解释器不存在:如果你的
healthcheck.sh首行配置的是#!/bin/bash这类路径,但基础镜像中没有预装对应解释器(比如Alpine镜像默认只带/bin/sh),直接执行脚本时系统会触发解释器找不到的错误,也会返回127退出码,报错信息容易和脚本本身找不到混淆。 - 运行时目录挂载覆盖:如果
docker run启动容器时配置了-v 本地路径:/root这类挂载参数,会覆盖镜像中原有的/root目录内容,健康检查读取的是挂载后的空目录,若你测试时是手动将脚本拷入容器,就会出现手动执行正常、健康检查失败的情况。
解决方案
- 优先升级Docker版本到20.10.8或更高的正式稳定版,直接修复版本自带的健康检查Bug。
- 若暂时无法升级Docker,可修改Dockerfile中的HEALTHCHECK指令,显式指定解释器执行脚本:
HEALTHCHECK --interval=600s --timeout=5s CMD /bin/sh /root/healthcheck.sh
如果脚本依赖bash,将路径换成/bin/bash即可。
- 检查
healthcheck.sh的首行shebang配置,确保路径和镜像中实际安装的解释器匹配,比如使用Alpine镜像时将shebang改为#!/bin/sh。 - 检查容器启动命令,移除对
/root目录的挂载配置,或者调整挂载路径到其他非系统目录,避免覆盖脚本文件。
内容的提问来源于stack exchange,提问作者milosa
相关产品推荐
相关产品推荐

