多阶段构建Dockerfile文件缺失错误的原因及修复方法
Docker多阶段构建COPY失败:文件不存在的问题解决
错误原因
兄弟,你这问题是典型的文件名不匹配导致的!看你的Dockerfile和构建日志就能明白:
在编译阶段的RUN指令里,你用gcc生成的可执行文件是**.hello**(开头带点的隐藏文件):
RUN gcc ./hello.c -o .hello
但到了复制阶段,你却要复制一个叫**hello**的文件:
COPY --from=compiler /compiling/hello .
Docker在编译阶段的镜像里根本找不到hello这个文件,自然就抛出找不到文件的错误了。
修复方案
给你两个简单的修复选项,选哪个都行:
选项1:修改编译输出的文件名(推荐)
把编译生成的文件名改成hello,和后续复制路径对应上,逻辑更清晰直观:
FROM gcc:latest as compiler WORKDIR /compiling/ ADD hello.c . # 把输出文件名从.hello改为hello RUN gcc ./hello.c -o hello FROM scratch WORKDIR /running/ COPY --from=compiler /compiling/hello . CMD ["./hello"]
选项2:修改COPY的源文件路径
如果你非要保留隐藏文件名的命名方式,那就要同步修改COPY和CMD的对应路径:
FROM gcc:latest as compiler WORKDIR /compiling/ ADD hello.c . RUN gcc ./hello.c -o .hello FROM scratch WORKDIR /running/ # 复制隐藏文件.hello到目标目录 COPY --from=compiler /compiling/.hello . # 运行时也要指定对应的隐藏文件名 CMD ["./.hello"]
验证步骤
改完Dockerfile后,重新执行构建命令:
docker build -t hello-node3:v6 .
构建成功后跑个容器测试一下:
docker run hello-node3:v6
正常情况下就能看到你hello.c里的输出内容啦!
内容的提问来源于stack exchange,提问作者user1608790




