Dockerfile中的COPY和ADD命令有什么区别?我什么时候可以使用其中一个命令而不是另一个命令?
COPY <src> <dest>
COPY指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中
ADD <src> <dest>
ADD指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中。
Dockerfile中的COPY和ADD命令有什么区别?我什么时候可以使用其中一个命令而不是另一个命令?
COPY <src> <dest>
COPY指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中
ADD <src> <dest>
ADD指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中。
当前回答
如果您有foo.tar.gz文件,请比较以下命令。ADD命令创建的层比COPY命令少,并且在推送docker图像时节省了大量的网络流量。
ADD foo.tar.gz /
COPY foo.tar.gz /
RUN tar -zxvf foo.tar.gz
RUN rm -rf foo.tar.gz
其他回答
COPY不支持URL方案的<src>。COPY不会解压缩压缩文件。对于指令<src><dest>,如果<src>是tar压缩文件,且<dest>不以斜杠结尾:ADD将<dest>视为一个目录,并将<src>解压缩到该目录。COPY将<dest>视为一个文件,并将<src>写入其中。COPY支持通过--from arg覆盖生成上下文。
从Docker文档:
添加或复制虽然ADD和COPY功能相似,但一般来说,COPY是首选。这是因为它比ADD更透明。COPY仅支持将本地文件基本复制到容器中,而ADD具有一些不明显的功能(如仅本地的tar提取和远程URL支持)。因此,ADD的最佳用途是将本地tar文件自动提取到图像中,如ADD rootfs.tar.xz/中所示。
更多:编写Dockerfile的最佳实践
COPY将文件/目录从主机复制到图像。
ADD将文件/目录从主机复制到映像,但也可以获取远程URL、提取TAR文件等。。。
使用COPY将文件和/或目录复制到构建上下文中。
使用ADD下载远程资源、提取TAR文件等。。
关于这一点,有一些官方文档:编写Dockerfile的最佳实践
因为图像大小很重要,所以强烈不建议使用ADD从远程URL获取包;您应该改用curl或wget。这样,您就可以删除提取后不再需要的文件,并且不必在图像中添加另一层。
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.gz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
对于不需要ADD的tar自动提取功能的其他项目(文件、目录),您应该始终使用COPY。
如果要将xx.tar.gz添加到/usr/local-in容器中,请解压缩它,然后删除无用的压缩包。
副本:
COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz
对于ADD:
ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/
ADD仅支持本地焦油提取。除此之外,COPY将使用三层,但ADD仅使用一层。