Docker COPY命令执行失败求助:容器内生成文件无法复制?
问题根源:
COPY与RUN的作用范围混淆 你碰到的这个问题,核心是没搞明白Docker里COPY和RUN命令的本质区别:
COPY命令的作用是从你的本地构建上下文(也就是执行docker build .时指定的.目录)复制文件到镜像的文件系统中,它不会读取之前构建步骤里容器内部生成的文件。- 而你用
RUN mkdir target; echo "hello world" > ./target/test.txt是在镜像的容器环境里创建了这个文件,这个文件只存在于镜像的文件系统层中,并不在你的本地构建上下文里,所以COPY自然找不到它。
解决方法:用RUN cp替代COPY
如果要把容器内部生成的文件复制到另一个位置,应该使用RUN cp命令(在容器内部执行复制操作),修改后的Dockerfile如下:
FROM maven AS testdocker COPY . /server WORKDIR /server/admin RUN mkdir target; echo "hello world" > ./target/test.txt RUN pwd RUN ls -la ./target/ RUN cp ./target/test.txt /test.txt # 替换成容器内部的复制命令 CMD ["/usr/bin/java", "-jar", "/server.jar"]
额外说明
如果你的需求是把本地构建上下文里的文件复制到镜像里,那COPY是正确的选择;但如果是在构建过程中生成的文件需要在镜像内部移动/复制,一定要用RUN配合shell命令(比如cp、mv)来完成。
内容的提问来源于stack exchange,提问作者Rami Ramich
相关产品推荐
相关产品推荐

