协慌网

登录 贡献 社区

Dockerfile 中的 `COPY` 和 `ADD` 命令有什么区别?

Dockerfile 中的COPYADD命令有什么区别,我何时使用另一个?


COPY <src> <dest>

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


ADD <src> <dest>

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

答案

您应该查看ADDCOPY文档以获得有关其行为的详尽描述,但简而言之,主要区别在于ADD可以做的不仅仅是COPY

  • ADD允许<src>成为 URL
  • 如果ADD<src>参数是以可识别的压缩格式存档,则将对其进行解压缩

请注意, 编写 Dockerfiles最佳实践建议使用COPY ,其中不需要ADD的魔力。否则你(因为你必须查找这个答案)有一天你可能会感到惊讶,因为你的意思是将keep_this_archive_intact.tar.gz复制到你的容器中,而是将内容喷到你的文件系统上。

COPY

与 “ADD” 相同,但没有 tar 和远程 URL 处理。

直接从源代码引用。

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

由于图像大小很重要,因此强烈建议不要使用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