Skip to content
DevOps2026-09-083 分钟阅读

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

排查清单

  1. 文件真的在吗?--entrypoint sh 进容器 ls
  2. 在但报 not found?od -c 查 shebang 的 CRLF(Windows 编辑的脚本九成是它)
  3. ENTRYPOINT 是 exec 形式还想用 $VAR?改 shell 形式或用 entrypoint 脚本
  4. 路径相对的是 WORKDIR,不是你以为的目录
  5. exec format error → 架构不匹配,buildx --platform 重构建

本文由 ToolVault 工具匣 提供。相关工具:Dockerfile 生成器Linux 命令速查。相关阅读:Docker daemon 连不上排查容器名冲突排查。访问 首页 查看更多开发者工具。


广告