Docker文件中的'COPY'和'ADD'命令有什么区别?

docker dockerfile


Dockerfile中的 COPYADD 命令之间有什么区别,什么时候可以在另一个上使用?

COPY <src> <dest>

COPY指令将从 <src> 复制新文件,并将它们添加到路径为 <dest> 的容器文件系统中。

ADD <src> <dest>

ADD指令将从 <src> 复制新文件,并将它们添加到路径为 <dest> 的容器文件系统中。





Answer 1 icecrime


您应该查看 ADD COPY 文档以获取有关其行为的更详细描述,但简而言之,主要区别在于 ADD 可以做的比 COPY 还多:

  • ADD 允许 <src> 作为URL
  • 关于下面的评论, ADD 文档指出:

    如果是一个本地的压缩格式(identify、gzip、bzip2或xz),那么它将被解压缩为一个目录。来自远程URL的资源不会被解压。

请注意,编写Dockerfile的最佳实践建议在不需要 ADD 的情况下使用 COPY 。否则,当您打算将 keep_this_archive_intact.tar.gz 复制到您的容器中时,您(因为您必须查找此答案)可能有一天会感到惊讶,而是将内容喷洒到文件系统上。




Answer 2 caike


COPY

和'ADD'一样,但没有焦油和远程URL处理。

直接从源代码中引用。




Answer 3 Victor Laskin


关于这一点,有一些官方文档:编写Dockerfile的最佳实践

由于图像大小很重要,因此强烈建议不要使用 ADD 从远程URL获取软件包。您应该使用 curlwget 代替。这样,您可以在提取文件后删除不再需要的文件,而不必在图像中添加其他图层。

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




Answer 4 eddd


来自Docker docs。

添加或复制

尽管ADD和COPY在功能上相似,但通常来说COPY是首选。那是因为它比ADD更透明。COPY仅支持将本地文件基本复制到容器中,而ADD的某些功能(如仅本地tar提取和远程URL支持)并不是立即显而易见的。因此,与ADD rootfs.tar.xz /中一样,ADD的最佳用途是将本地tar文件自动提取到映像中。

更多:编写Dockerfile的最佳实践




Answer 5 BertLi


如果要将xx.tar.gz添加到容器中的 /usr/local ,请解压缩它,然后删除无用的压缩包。

对于复制。

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只使用一层。