Docker容器启动报错exec: /init.sh: not found,对应Dockerfile配置问题排查
错误原因与解决方案
错误排查方向
这个报错本质是容器启动时找不到指定的/init.sh可执行文件,或者无法正常解析执行该脚本,常见原因如下:
- COPY指令源路径配置错误:Dockerfile中的
COPY /init.sh /init.sh源路径前缀/不符合Docker语法规则,COPY指令的源路径是相对于构建上下文(即执行docker build命令时指定的目录)的相对路径,带前缀/会导致Docker从构建上下文的根路径查找文件,若本地init.sh不在构建上下文根目录下,会出现复制缺失的问题。 - 脚本换行符格式不兼容:如果在Windows环境下编写init.sh,默认使用CRLF换行符,Linux系统的脚本解析器无法识别该格式,会误以为脚本指向的解释器不存在,抛出找不到文件的错误。
- 脚本指定的解释器不存在:如果init.sh开头的shebang声明为
#!/bin/bash,但php:7.1-apache基础镜像默认未预装bash,仅自带sh,也会触发该报错。 - .dockerignore规则屏蔽了脚本:如果项目的.dockerignore文件配置了屏蔽
.sh后缀文件的规则,会导致COPY指令无法将init.sh复制到镜像内。
修复步骤
- 修正COPY指令写法,将
COPY /init.sh /init.sh改为COPY init.sh /init.sh,同时确保执行docker build的目录下直接存放init.sh文件。 - 把init.sh的换行符转换为Linux兼容的LF格式:
- VS Code可点击右下角状态栏的换行符选项,将CRLF切换为LF后保存
- Linux/Mac环境可执行
dos2unix init.sh完成格式转换
- 修正脚本的解释器声明,将init.sh开头的shebang改为
#!/bin/sh,或者在Dockerfile的apt install软件列表中追加bash,手动安装bash环境。 - 检查.dockerignore文件,删除屏蔽
.sh文件的规则,确保init.sh能被正常复制到镜像内。
验证方法
修复后可执行如下命令验证文件状态:
docker run --rm --entrypoint sh 你的镜像名称 -c "ls -la /init.sh && head -n 1 /init.sh"
若输出init.sh的权限为-rwxr-xr-x且首行解释器声明正常,说明修复成功。
内容的提问来源于stack exchange,提问作者TheCallofDuty
相关产品推荐
相关产品推荐

