You need to enable JavaScript to run this app. 升级Docker 20.10.7后healthcheck.sh找不到致容器不健康如何解决
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 05:45:10