Article / 文章中心

Dockerfile中COPY和ADD

发布时间:2021-11-19 点击数:368

一、COPY指令

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

1.COPY两种格式:

  • COPY [--chown=<user>:<group>] <src>... <dest>
  • COPY [--chown=<user>:<group>] ["<src>",... "<dest>"](包含空格的路径需要使用这种格式)

2.COPY使用规则

复制指令必须遵循以下规则:

  1. <src>路径必须在构建的上下文中;您不能复制../something/something,因为docker构建的第一步是将上下文目录(和子目录)发送到docker守护进程。
  2. 如果<src>是一个目录,则复制该目录的全部内容,包括文件系统元数据。

二、ADD指令

1.ADD两种格式:

  • ADD [--chown=<user>:<group>] <src>... <dest>
  • ADD [--chown=<user>:<group>] ["<src>",... "<dest>"](包含空格的路径使用这种格式)


2. ADD 额外的功能 :

(1).ADD 指令可以让你使用 URL 作为 <src> 参数。当遇到 URL 时候,可以通过 URL 下载文件并且复制到 <dest>。

(2).ADD 的另一个特性是自动解压文件的能力。如果 <src> 参数是一个可识别压缩格式(tar, gzip, bzip2, …)的本地文件(注:无法实现同时下载并解压),就会被解压到指定容器文件系统的路径 <dest> 下。

3.ADD使用规则

  1. <src>路径必须在构建的上下文中;您不能添加../something/something,因为docker构建的第一步是将上下文目录(和子目录)发送到docker守护进程。
  2. 如果<src>是一个URL并且<dest>没有以斜杠结尾,则会从URL下载一个文件并复制到<dest>。
  3. 如果<src>是一个URL,并且<dest>以斜杠结尾,则从URL推断文件名,并将文件下载到<dest>/<filename>。例如,添加http://example.com/foobar /将创建文件/foobar。URL必须有一个非平凡的路径,以便在这种情况下可以找到适当的文件名(http://example.com 不起作用)。
  4. 如果<src>是一个目录,则复制该目录的全部内容,包括文件系统元数据。

三、实战

  1. To add all files starting with “hom”:copy以"hom" 开头的所有文件到镜像的/mydir/目录
 COPY hom* /mydir/
  1. The example below uses a relative path, and adds “test.txt” to <WORKDIR>/relativeDir/:  copy上下文中的test.txt到 工作目录的relativeDir目录
COPY test.txt relativeDir/

四、总结

对于不需要自动解压的文件或目录,应该始终使用COPY指令。

最后,认准一个原则:总是使用COPY(除非我们明确需要ADD)。