多层Dockerfile使用COPY --from复制失败找不到文件,是我的写法有问题吗?
问题根因
- 首先明确:Docker的
COPY --from报错中提示不存在的路径是源路径(即从前置阶段拉取文件的路径),而非你调整的目标路径,所以反复修改目标路径无法解决问题。 - 具体触发原因通常为以下几种:
- 前端构建产物路径不匹配:绝大多数前端框架(Vue、React、Vite等)执行
npm run build后,静态产物默认输出到项目根目录下的dist文件夹,对应UI阶段的路径为/ui/dist,你当前写的源路径/ui虽然本身存在,但如果你本地配置了特殊的产物输出路径,实际产物目录不存在就会触发报错。 - UI阶段构建实际未正常完成:即使你认为构建步骤正常,若存在隐性报错导致产物目录未生成,也会出现路径不存在的问题。
- 构建命令跳过了UI阶段:如果执行
docker build时添加了--target PROD参数,Docker会直接跳过UI阶段的构建,自然无法读取到UI阶段的任何文件。 - 阶段别名大小写不匹配:你定义的阶段别名为大写
UI,如果COPY --from中写为小写ui,大小写敏感的系统会识别为不同阶段,导致源路径无法寻址。
- 前端构建产物路径不匹配:绝大多数前端框架(Vue、React、Vite等)执行
解决方案
- 先确认UI阶段的目录结构:在UI阶段的
RUN npm run build后新增一行RUN ls -la /ui,重新执行构建查看输出的目录结构,确认产物所在的实际路径,比如确认产物存放在/ui/dist。 - 调整COPY指令的源路径为实际的产物路径,示例如下:
# 示例:将UI阶段/ui/dist下的所有产物拷贝到PROD阶段的./priv/ui/目录 COPY --from=UI /ui/dist/ ./priv/ui/
- 检查你的
docker build命令,确认没有添加错误的--target参数跳过UI阶段。 - 确保
COPY --from后的阶段别名和你定义的as UI大小写完全一致。 - 如果你确实需要拷贝整个UI阶段的
/ui目录而非仅产物,通过上述加RUN ls的方式确认UI阶段构建完成后/ui目录及下属文件确实存在即可。
内容的提问来源于stack exchange,提问作者Zazaeil
相关产品推荐
相关产品推荐

