构建Docker镜像报container_linux.go:344启动容器进程错误如何解决
报错原因
该错误的核心是构建依赖的someimage:latest基础镜像近期发生了变更,新版本镜像中不存在默认shell程序/bin/sh,Docker初始化构建阶段的临时容器时无法调用默认shell,因此抛出异常。
常见的基础镜像变动场景包括:
- 镜像维护方将基础镜像从带shell的常规发行版切换为无发行版(distroless)镜像,这类镜像仅保留应用运行的最小依赖,默认不内置shell
- 镜像维护方调整了新版本镜像的文件系统结构,删除或移动了
/bin/sh的存储路径 - 本地拉取的
someimage:latest镜像文件损坏,导致shell文件丢失
排查步骤
- 验证基础镜像版本变动:找到历史正常构建时使用的
someimage镜像哈希值,替换latest标签重新执行构建命令
sudo docker build --target my-image .
如果使用旧哈希可以正常构建,即可确认是最新版基础镜像缺少/bin/sh导致的问题。
2. 检查当前基础镜像的文件系统:直接运行基础镜像验证/bin/sh是否存在
# 尝试用sh启动容器 sudo docker run --rm -it someimage:latest sh # 若上一步报错,直接查看文件是否存在 sudo docker run --rm -it --entrypoint ls someimage:latest -l /bin/sh
如果执行后提示文件不存在,即可确认镜像中确实缺少shell。
解决方案
根据你的使用场景选择对应方案:
- 若你当前的构建阶段不需要执行任何额外命令,仅需要引用该镜像作为后续阶段的基础,可直接锁定基础镜像到有shell的旧版本,或显式置空ENTRYPOINT跳过shell校验:
# 方案1:锁定到历史可用的镜像版本,替换为你自己的镜像哈希 FROM someimage@sha256:xxxxxx as my-image # 方案2:显式置空ENTRYPOINT,避免shell校验 FROM someimage:latest as my-image ENTRYPOINT []
- 若你后续需要在该阶段执行shell命令,需更换为内置shell的基础镜像版本,或在当前基础镜像中自行编译安装shell到
/bin/sh路径。
内容的提问来源于stack exchange,提问作者Pravin.2087
相关产品推荐
相关产品推荐

