executable file not found:Docker 容器启动即退出的 4 种原因(含 exec format error)
现象:容器起来一瞬就退出
# 容器启动时
standard_init_linux.go: exec: "./start.sh": stat ./start.sh: no such file or directory
# 或 docker exec 时
OCI runtime exec failed: exec: "sh": executable file not found in $PATH: unknown
# 或另一种形态
exec ./start.sh: no such file or directory
一行结论:容器里找不到你让它执行的那个文件/命令。最大的陷阱在于:报 no such file or directory 时,文件往往就在那里——真正缺失的是脚本的解释器(shebang 指向的程序不存在)。这是 Docker 报错里最误导人的一条。
四种原因,按概率排序
1. Windows 的 CRLF 行尾毁掉了 shebang(最阴险)
在 Windows 上编辑的 shell 脚本行尾是 \r\n,第一行实际变成了:
#!/bin/sh\r
Linux 找的是 sh\r 这个程序——不存在,于是报 no such file or directory,而你 ls 看到脚本明明在。验证与修复:
docker run --rm --entrypoint sh myapp -c "head -1 /app/start.sh | od -c | head -2"
# 看到 \r \n 就是它了
# 修复:仓库加 .gitattributes
*.sh text eol=lf
编辑器右下角把 CRLF 切换成 LF 重存一遍也行。
2. ENTRYPOINT 的 exec 形式里用了环境变量拼接
# ❌ exec 形式不会经过 shell,$JAVA_OPTS 不展开,字面量去找
ENTRYPOINT ["java", "$JAVA_OPTS", "-jar", "app.jar"]
# ✅ 要展开变量就用 shell 形式(注意会丢信号传递)
ENTRYPOINT java ${JAVA_OPTS} -jar app.jar
exec 形式 ["a","b"] 不启动 shell,$VAR、~、通配符都是字面量;shell 形式 a b 经过 /bin/sh -c,变量会展开。分不清这两种形式是这个错误的高发源头。同理,ENTRYPOINT ["npm", "start"] 找不到 npm,多半是基础镜像里 npm 不在 PATH 或装在别的用户目录下。
3. 路径问题:相对路径与 WORKDIR
WORKDIR /app
COPY start.sh . # 文件在 /app/start.sh
ENTRYPOINT ["./start.sh"] # ✅ 相对 WORKDIR
ENTRYPOINT ["/start.sh"] # ❌ 根目录下没有
docker exec 进容器手动跑一遍最快:
docker run --rm --entrypoint sh myapp -c "ls -la /app && which npm"
4. 架构不匹配:exec format error
exec /app/start.sh: exec format error
M 系列 Mac 构建的 arm64 镜像跑在 x86 服务器上(或反之)。这不是文件找不到,是二进制格式不对。构建时锁平台:
docker buildx build --platform linux/amd64 -t myapp --push .
docker inspect --format '{{.Architecture}}' myapp 确认镜像架构。
调试三板斧
# 1. 看镜像实际配置的入口
docker inspect myapp --format '{{json .Config.Entrypoint}} {{json .Config.Cmd}}'
# 2. 绕过入口直接进容器看现场
docker run --rm --entrypoint sh myapp
# 进去后:ls 确认文件、head -1 xxx.sh | od -c 查 CRLF、which xxx 查 PATH
# 3. 精简 Dockerfile 里逐步执行,哪一步炸的一目了然
docker run --rm myapp ls /app
排查清单
- 文件真的在吗?
--entrypoint sh进容器ls - 在但报 not found?
od -c查 shebang 的 CRLF(Windows 编辑的脚本九成是它) - ENTRYPOINT 是 exec 形式还想用
$VAR?改 shell 形式或用 entrypoint 脚本 - 路径相对的是 WORKDIR,不是你以为的目录
exec format error→ 架构不匹配,buildx--platform重构建
本文由 ToolVault 工具匣 提供。相关工具:Dockerfile 生成器、Linux 命令速查。相关阅读:Docker daemon 连不上排查、容器名冲突排查。访问 首页 查看更多开发者工具。
相关工具
相关文章
Permission denied (publickey) 怎么解决?Git 推送失败的 6 种原因与修复
git clone/push 报 Permission denied (publickey) fatal: Could not read from remote repository?覆盖公钥没生成、没加载进 agent、没添加到 GitHub/Gitee、多账号配错密钥、deploy key 权限、remote URL 写错六种根因,附 ssh -v 诊断方法。
npm ERR! ERESOLVE:peer dependency 冲突的四种解决策略
npm install 报 ERESOLVE unable to resolve dependency tree 怎么办?理解 peer dependency 的设计意图,掌握四种解决策略(版本修复 / legacy-peer-deps / overrides / dedupe)及其适用场景与风险。
error:0308010C digital envelope routines::unsupported 怎么解决?Node 17+ 跑老项目的三种修法
Node 17+ 启动 webpack 4 老项目报 error:0308010C:digital envelope routines::unsupported?根因是 OpenSSL 3.0 移除了 MD4 哈希。本文给出 --openssl-legacy-provider 临时方案、升级 webpack 5 根治方案和锁定 Node 16 的取舍。