Django项目推送容器至Heroku时莫名出现run.sh not found错误如何解决
问题修复方案
核心故障原因
你遇到的/bin/sh: run.sh: not found报错、进程退出码127,排除路径、权限配置问题后,最高发的诱因是shell脚本换行符不兼容:合并分支时如果有Windows环境提交的run.sh代码,git未自动转换换行符的情况下,文件会保留Windows风格的\r\n(CRLF)换行符,Alpine Linux的shell无法识别。
此时脚本首行#!/bin/sh末尾会被带上不可见的\r字符,系统会尝试寻找/bin/sh\r这个不存在的解释器,最终抛出「文件不存在」的错误,这也是你调整文件路径、重命名都无效的核心原因。
修复步骤
- 转换
run.sh的换行符为Linux风格(LF)- VS Code操作:打开
scripts/run.sh,点击右下角状态栏的「CRLF」标识,切换为「LF」后保存文件 - 命令行操作:安装
dos2unix工具后执行dos2unix scripts/run.sh
- VS Code操作:打开
- 配置git换行符规则,避免后续重复出现同类问题:
# Windows用户执行:提交时自动转LF,检出时自动转CRLF git config --global core.autocrlf true # Linux/Mac用户执行:提交时自动转LF,检出时不转换 git config --global core.autocrlf input # 禁止提交混合换行符的文件,提前拦截问题 git config --global core.safecrlf true - 兜底兼容方案:可以直接修改Dockerfile的CMD指令,显式指定解释器执行脚本,绕开shebang解析逻辑:
将原CMD ["run.sh"]替换为:CMD ["sh", "/scripts/run.sh"] - 额外排查项:检查项目根目录的
.dockerignore、.gitignore文件,确认合并分支后没有新增scripts/相关的忽略规则,避免构建镜像时未将run.sh打包到镜像内。
修改完成后重新提交代码、构建镜像推送到Heroku即可正常启动。
内容的提问来源于stack exchange,提问作者Lomank
相关产品推荐
相关产品推荐

