You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式

手动验证步骤

可进入容器交互式环境排查问题:

  1. 启动容器的交互式Shell:
    docker run -it --rm --entrypoint sh your-image-name
    
  2. 查看脚本的shebang:
    head -n1 /scripts/commands.sh
    
  3. 检查换行符格式:
    cat -A /scripts/commands.sh  # 若每行结尾有^M,说明是CRLF格式
    

内容的提问来源于stack exchange,提问作者Dayvison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:12:44