Dockerfile运行shell脚本出现exec format错误如何解决
错误原因
该报错的核心诱因有两个:
- 你的
myscript.sh没有声明脚本解释器的shebang行,Linux内核无法确定用什么程序执行该脚本 - 脚本是在Windows环境下编写的,行尾序列为Windows专属的
CRLF格式,alpine系统的Linux内核只能识别LF格式的行尾,解析脚本时出错
你写的ENV PATH="${PATH}:/bin/myscript.sh"是错误配置(PATH需要添加目录路径而非文件路径),但不是本次报错的直接原因。
修复方案
第一步:修正shell脚本内容
给myscript.sh添加shebang声明,注意alpine镜像默认未预装bash,使用/bin/sh作为解释器即可:
#!/bin/sh echo 'test'
第二步:转换行尾序列为Linux格式
二选一操作即可:
- 本地修改:用编辑器打开脚本,将行尾序列从
CRLF切换为LF后保存;如果是Linux/Mac环境,可直接执行dos2unix myscript.sh完成转换 - Dockerfile内自动处理:在COPY脚本的步骤后增加转换逻辑,避免本地环境影响,修改后的Dockerfile片段如下:
COPY myscript.sh /bin/myscript.sh # 新增行:删除脚本里的Windows换行符 RUN sed -i 's/\r$//' /bin/myscript.sh RUN ["chmod", "+x", "/bin/myscript.sh"] # 冗余的ENV PATH配置可以直接删除,/bin默认已经在环境变量中
额外排查点
如果按照上述步骤修改后仍然报错,可检查镜像构建架构和运行环境架构是否匹配,跨架构运行容器也会触发相同报错,可在构建镜像时通过--platform参数指定和运行环境一致的架构,比如docker build --platform linux/amd64 .
修改完成后重新构建镜像再启动容器即可解决报错。
内容的提问来源于stack exchange,提问作者cuneyttyler
相关产品推荐
相关产品推荐

