Docker构建异常:脚本存在却无法执行(Ubuntu正常Windows报错)
Docker跨平台构建:Windows主机执行Bash脚本提示文件不存在(退出码127)的解决办法
问题场景
- 原本的Dockerfile流程:把本地的Bash脚本
install_ssh_keys.sh复制到容器/tmp目录,给脚本加可执行权限,切换用户后执行脚本 - Ubuntu主机上构建镜像完全正常,但在Windows 10主机上构建时:
- 用
RUN ls -l /tmp和RUN stat /tmp/install_ssh_keys.sh能确认文件确实存在,且权限是可执行的 - 执行脚本时却报错:
/tmp/install_ssh_keys.sh: No such file or directory,返回退出码127 - 试过直接
RUN /tmp/install_ssh_keys.sh、RUN bash /tmp/install_ssh_keys.sh等多种执行方式,都没解决问题
- 用
问题根源
这是Windows和Linux的换行符差异导致的:Windows系统默认用CRLF(\r\n)作为换行符,而Linux用LF(\n)。当Windows主机把本地脚本复制到Linux容器时,脚本里的换行符还是CRLF格式,Bash解析时会把开头的#!/bin/bash后面的CR字符当成脚本路径的一部分,实际是在找/tmp/install_ssh_keys.sh\r这个不存在的文件,所以触发了“文件不存在”的错误。
解决方法:在Dockerfile内直接生成脚本
放弃从本地复制脚本,改为在Dockerfile里用Here Document的方式直接生成脚本内容,这样脚本在容器内生成,自然是Linux兼容的LF换行符,彻底避免跨平台换行符问题。
示例代码:
# 先在root用户下生成脚本(方便设置权限) RUN cat > /tmp/install_ssh_keys.sh << 'EOF' #!/bin/bash # 这里替换成你的脚本实际逻辑 echo "开始安装SSH密钥..." mkdir -p ~/.ssh chmod 700 ~/.ssh # 其他操作步骤... EOF # 给脚本加可执行权限 RUN chmod +x /tmp/install_ssh_keys.sh # 切换到目标用户后执行脚本 USER your-target-user RUN /tmp/install_ssh_keys.sh
用这种方式构建,不管是Ubuntu还是Windows主机,都能正常执行脚本,不会再出现退出码127的错误。
内容的提问来源于stack exchange,提问作者Denis Beurive
相关产品推荐
相关产品推荐

