如果我们想在Dockerfile中添加资源(通常是文件或者文件目录)有两种形式,那么我们在实际使用时究竟选择哪一个指令好一点呢?下面我将分别介绍两者的区别与联系,搞懂了它们各自的用途,就知道怎么选择了

在前面的文章中大致介绍了ADDCOPY的用法,如何使用将不再赘述,下面详细说明它们的区别与联系。

  • ADD 指令

ADD指令用于从src处拷贝新的文件、文件目录或者由URL标记的文件,并将这些资源添加到镜像文件系统中指定的位置dest, 官方给出的定义如下:

The ADD instruction copies new files, directories or remote file URLs 
from <src> and adds them to the filesystem of the image at the path 
<dest>.
  • COPY指令

COPY指令用于从src处拷贝新的文件,文件目录,并将这些资源添加到容器文件系统中指定的位置dest, 官方给出的定义如下:

The COPY instruction copies new files or directories from <src> and 
adds them to the filesystem of the container at the path <dest>.

对于两者的定义,区别可能比较清晰了:

  • 第一处ADD指令可以添加URL资源,或者说可以直接从远程添加文件到镜像中,或者说,而COPY不具备这样的能力;
  • 第二处ADD指令将这些资源添加到镜像镜像的文件系统;而COPY指令是将这些资源添加到容器的文件系统中;ADD指令是将资源添加到静态文件系统中,COPY指令是将资源添加到动态文件系统中,具体有什么实质性的体现呢?
    下面详细说明ADD指令带来的实际影响。
  • 如果src是文件类型的资源,dest/结尾, 则docker会把dest当作一个目录看待,会把资源拷贝到dest目录下。如果dest不存在,则会创建dest目录;
  • 如果src是个文件类型的资源,dest不以/结尾,则docker会把dest当作一个文件看待;
  • 如果dest存在,则会把src拷贝到dest的上级目录中,并重命名为dest;如果目标文件dest是已存在,会用源文件中的内容覆盖掉dest中的内容。
  • 如果src是个目录,且dest不存在,则docker会创建一个名为dest的目录,把src目录下的文件拷贝进来。如果dest是个已经存在的目录,则docker会把src目录下的文件拷贝到该目录下。
  • 如果源文件是压缩文件,则docker会自动解压。

以上是这两个指令之间的区别与联系,大家根据自己对这两条指令的熟悉程度使用,
建议在不熟悉两个指令的情况下,使用COPY不会带来更多的麻烦,其他的处理可通过RUN指令来完成,因为ADD指令的有些行为不可控、不可见,也可以自己抽点时间测试验证一下。