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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:02:12