Django应用Docker容器执行commands.sh提示‘文件未找到’求助
问题原因分析及解决方案
原因1:脚本依赖bash,但Alpine镜像默认无bash
Alpine Linux默认仅预装ash(BusyBox内置的shell),未包含bash。若commands.sh的开头shebang是#!/bin/bash,容器内找不到bash解释器,就会抛出"no such file or directory"(该错误具有误导性,实际是找不到脚本依赖的解释器,而非脚本本身不存在)。
对应解决方案:
- 方案1:修改脚本的shebang为
#!/bin/sh,Ash兼容绝大多数Shell脚本语法 - 方案2:在Dockerfile的apk安装步骤中添加bash:
RUN apk update && \ apk add --no-cache binutils gdal geos proj-dev bash && \ # 后续原有安装命令...
原因2:脚本使用Windows格式换行符(CRLF)
若脚本在Windows环境编辑过,或Git克隆时自动转换了换行符,脚本内的换行符会是\r\n(CRLF),而Linux系统预期的是\n(LF)。执行脚本时,shebang行会被解析为#!/bin/sh\r,系统会寻找不存在的/bin/sh\r文件,进而报错。
对应解决方案:
- 调整Git配置,禁止自动转换换行符:
git config --global core.autocrlf false - 在Dockerfile中添加
dos2unix转换脚本格式:RUN apk add --no-cache dos2unix && \ dos2unix /scripts/commands.sh && \ rm -f /usr/bin/dos2unix # 可选:清理不必要的依赖包 - 手动用编辑器(如VS Code)将脚本换行符改为LF格式
手动验证步骤
可进入容器交互式环境排查问题:
- 启动容器的交互式Shell:
docker run -it --rm --entrypoint sh your-image-name - 查看脚本的shebang:
head -n1 /scripts/commands.sh - 检查换行符格式:
cat -A /scripts/commands.sh # 若每行结尾有^M,说明是CRLF格式
内容的提问来源于stack exchange,提问作者Dayvison
相关产品推荐
相关产品推荐

