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>的容器文件系统中。
当前回答
资料来源:https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile:
COPY和ADD都是Dockerfile指令,具有相似的用途。它们允许您将文件从特定位置复制到Docker映像中。COPY接受src和destination。它只允许您将本地文件或目录从主机(构建Docker映像的机器)复制到Docker映像本身。ADD也允许您这样做,但它还支持其他两个源。首先,您可以使用URL而不是本地文件/目录。其次,您可以将tar文件从源文件直接提取到目标文件中ADD的一个有效用例是当您想要将本地tar文件提取到Docker映像中的特定目录中时。如果要将本地文件复制到Docker映像,请始终使用COPY,因为它更显式。
其他回答
ADD指令从本地或远程源复制文件或文件夹,并将其添加到容器的文件系统中。它用来复制本地文件,这些文件必须在工作目录中。ADD指令将本地.tar文件解包到目标映像目录。
实例
ADD http://someserver.com/filename.pdf /var/www/html
COPY从工作目录复制文件并将其添加到容器的文件系统中。无法使用Dockerfile指令的URL复制远程文件。
实例
COPY Gemfile Gemfile.lock ./
COPY ./src/ /var/www/html/
关于这一点,有一些官方文档:编写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。
COPY将文件/目录从主机复制到图像。
ADD将文件/目录从主机复制到映像,但也可以获取远程URL、提取TAR文件等。。。
使用COPY将文件和/或目录复制到构建上下文中。
使用ADD下载远程资源、提取TAR文件等。。
副本为
与“ADD”相同,但没有tar和远程URL处理。
直接从源代码引用。
COPY不支持URL方案的<src>。COPY不会解压缩压缩文件。对于指令<src><dest>,如果<src>是tar压缩文件,且<dest>不以斜杠结尾:ADD将<dest>视为一个目录,并将<src>解压缩到该目录。COPY将<dest>视为一个文件,并将<src>写入其中。COPY支持通过--from arg覆盖生成上下文。