You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker构建报runc run failed 无/bin/sh无法启动容器如何解决

问题报错

执行docker build构建镜像,运行到RUN npm install --production @contrast/agent指令时抛出如下错误:

runc run failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory
executor failed running [/bin/sh -c npm install --production @contrast/agent]: exit code: 1
问题根因

Docker的RUN指令默认采用shell格式执行,逻辑是自动调用镜像内的/bin/sh -c拼接后续命令运行。报错直接说明执行到当前层时,镜像文件系统中不存在/bin/sh可执行文件,通常由两类原因导致:

  • 选用的基础镜像本身做了极致裁剪,不带shell环境,比如scratch空镜像、distroless镜像、自定义裁剪删除了shell的极简镜像
  • 当前RUN指令之前的Dockerfile操作误删/覆盖了系统shell,比如COPY指令把本地目录直接拷贝到镜像根目录覆盖了/bin路径、执行rm命令误删了/bin下的sh文件、多阶段构建拷贝文件时覆盖了系统核心目录
排查步骤
  • 校验基础镜像:单独运行基础镜像验证sh是否存在,执行命令docker run --rm <你的基础镜像名:版本标签> ls /bin/sh,如果命令返回找不到文件的同类错误,说明基础镜像本身不带shell。
  • 检查前置指令:如果基础镜像自带sh,逐行核对该RUN指令之前的所有配置,重点排查COPY/ADD的目标路径是否为系统根目录、/bin目录等系统路径,是否存在删除系统核心文件的rm操作,多阶段构建的拷贝逻辑是否覆盖了系统文件。
解决方法

根据排查到的原因对应处理:

  1. 基础镜像本身不带shell的场景
  • 优先换用带shell环境的官方基础镜像,比如官方node系列镜像默认内置sh和完整的构建依赖,适配绝大多数npm安装场景,不需要额外调整配置。
  • 如果必须使用无shell的极简镜像缩小最终产物体积,采用标准多阶段构建逻辑:单独选带shell、带node/npm的镜像作为构建阶段,在构建阶段完成npm依赖安装、代码编译等所有需要执行命令的操作,最后把构建好的产物(比如node_modules、编译后的代码文件)拷贝到无shell的极简运行阶段镜像即可。
  • 如果确实需要在无shell的镜像层执行命令,将RUN指令改为exec数组格式,跳过shell调用直接执行目标命令,写法示例:
    RUN ["npm", "install", "--production", "@contrast/agent"]
    
    注意该写法要求所有参数都使用双引号包裹为数组元素,且必须保证npm命令在镜像的PATH路径中,或写全npm的绝对路径。
  1. 前置操作误删/覆盖shell的场景
  • 调整COPY/ADD指令的目标路径,禁止将本地业务目录直接拷贝到镜像根目录、/bin、/usr等系统路径覆盖原有系统文件,比如拷贝本地业务代码应指定到/app这类单独的业务目录下。
  • 删除构建过程中清理系统核心目录的指令,不要随意删除/bin、/lib、/usr等路径下的系统文件。

内容的提问来源于stack exchange,提问作者HiDoG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:39:30