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

Docker COPY指令复制文件失败问题求助

解决Docker COPY脚本后RUN提示"not found"的问题

这种问题我碰到过好几次,尤其是在Windows环境下构建基于Alpine的镜像时,大概率是下面几个原因之一,咱们一个个排查:

1. 脚本的换行符格式不兼容(最常见)

Windows系统默认用CRLF(回车+换行)作为文本换行符,而Linux/Alpine容器里的shell只认LF(换行)。当你把Windows下编辑的install.sh复制到容器后,脚本开头的#!/bin/sh会变成#!/bin/sh^M(^M是CR的转义符),shell会试图去找/bin/sh^M这个不存在的解释器,所以报错"not found"——看起来是脚本找不到,实际是解释器不对。

解决方法:

  • 如果你用Git管理代码,可以在仓库根目录创建.gitattributes文件,添加一行:
    *.sh text eol=lf
    
    这样Git会自动把sh脚本转换成LF换行符,不管你在什么系统下编辑。
  • 手动转换:用Notepad++、VS Code这类编辑器打开install.sh,把换行符改成LF(VS Code右下角可以切换),然后保存。

2. Docker构建上下文不包含脚本文件

Docker build的时候,只会把构建上下文目录(就是你docker build后面指定的路径,通常是.)里的文件复制到镜像里。如果你的install.sh不在这个目录里,或者在被.dockerignore排除的路径里,COPY指令其实根本没把文件复制进去,自然会提示找不到。

解决方法:

  • 确认install.sh和Dockerfile在同一个目录下,或者在构建上下文范围内。
  • 检查.dockerignore文件,确保没有把install.sh或者它所在的目录排除掉。
  • 构建时明确指定正确的上下文:比如docker build -t myimage .(.表示当前目录为上下文)。

3. Windows下的隐藏文件名后缀

有时候Windows会自动给文本文件加上.txt后缀,但在文件资源管理器里隐藏已知后缀名,导致你看到的是install.sh,实际文件名是install.sh.txt。COPY到容器里后,文件名变成/install.sh.txt,你运行/install.sh当然找不到。

解决方法:

  • 打开Windows文件资源管理器的"查看"选项卡,勾选"文件扩展名",确认文件名确实是install.sh,没有多余的后缀。

4. 脚本缺少可执行权限(补充排查点)

如果脚本复制进去了,但没有可执行权限,报错通常是"Permission denied",不过也有可能因特殊情况表现异常。可以在Dockerfile里加一步赋予权限:

COPY install.sh /install.sh
RUN chmod +x /install.sh && /install.sh

你提到其他人运行相同脚本没问题,说明脚本本身是正常的,问题肯定出在你的本地环境或者构建流程上,先从换行符和上下文这两点入手排查,应该能快速解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:19:54