Docker容器内执行Bash脚本出现exec format error的原因
解决Docker容器的"exec format error"问题
这个standard_init_linux.go:190: exec user process caused "exec format error"错误通常由几个常见问题引发,结合你封装Mono工具的场景,我帮你梳理下可能的原因和对应解决办法:
1. 脚本换行符格式不兼容
如果你的Bash脚本是在Windows环境下编辑的,它的换行符大概率是Windows风格的CRLF(\r\n),但Linux容器里的Bash只识别Unix风格的LF(\n)。这种情况下,Bash会把#!/bin/bash后面的\r当成命令的一部分,导致无法正确解析脚本开头的shebang行,直接触发格式错误。
解决办法:
- 本地转换格式:用
dos2unix工具处理脚本,或者在VS Code等编辑器里把换行符设置为LF后重新保存。 - 镜像构建时处理:如果没法提前修改脚本,可以在Dockerfile里加入转换步骤:
RUN apt-get update && apt-get install -y dos2unix RUN dos2unix /home/your-script.sh
2. 脚本缺少执行权限
如果你的脚本没有被设置为可执行权限,Docker尝试启动它时会失败,也可能触发这个错误。
解决办法:
- 构建镜像时添加权限:在Dockerfile里COPY脚本后,用
chmod +x赋予执行权限:COPY your-script.sh /home/script.sh RUN chmod +x /home/script.sh - 临时 workaround:运行容器时显式指定bash来执行脚本:
docker run -v /home/data:/data_input -i -t toolcontainer bash /home/script.sh nameofscript -i=/data_input/fileinput -o=/data_input/ -m -c=PXD00001
3. 镜像与主机架构不匹配
如果你的主机是ARM架构(比如M系列Mac、树莓派),而你构建的镜像是基于x86_64架构的,或者反过来,Mono的二进制文件和主机架构不兼容,就会出现执行格式错误。
解决办法:
- 开启跨架构兼容:Docker Desktop用户可以开启
Rosetta for x86/amd64 emulation on Apple Silicon选项,自动兼容跨架构镜像。 - 指定架构构建:构建镜像时明确指定目标架构,比如:
docker build --platform linux/amd64 -t toolcontainer .
4. Shebang行与基础镜像不匹配
虽然你的脚本写了#!/bin/bash,但如果容器的基础镜像里没有/bin/bash(比如用了alpine这类轻量镜像,默认只有/bin/sh),也会导致无法执行脚本。
解决办法:
- 安装bash:如果用的是alpine镜像,先安装bash:
RUN apk add --no-cache bash - 替换shebang:如果脚本兼容POSIX shell,可以把开头改为
#!/bin/sh。
结合你的场景,最可能的原因是前两个(换行符或执行权限),建议先排查这两点。
内容的提问来源于stack exchange,提问作者ypriverol
相关产品推荐
相关产品推荐

