Dockerfile中COPY和ADD

简介: 在 Dockerfile 中有COPY 和 ADD两个指令, 它们允许我们将文件从特定位置复制到 Docker 镜像中。它们有着非常类似的作用,又有细微的差别。

一、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)。


相关文章
|
缓存 Linux Go
Dockerfile(11) - COPY 指令详解
Dockerfile(11) - COPY 指令详解
2824 0
|
开发者 Docker 容器
DockerFile的ADD和COPY的区别
DockerFile的ADD和COPY的区别
3900 0
|
缓存 开发工具 git
报错:Git上传代码报错 will not add file alias already exists in index
报错:Git上传代码报错 will not add file alias already exists in index
459 0
|
6月前
|
存储 Python
copy
【6月更文挑战第10天】
32 0
|
7月前
|
开发工具 git
git报错 Unable to create ‘D:/project/xxx/.git/index.lock‘: File exists.
git报错 Unable to create ‘D:/project/xxx/.git/index.lock‘: File exists.
303 1
|
缓存 Linux Docker
44-Dockerfile-ADD/COPY指令
44-Dockerfile-ADD/COPY指令
|
Android开发
svn: E155004: There are unfinished work items in ‘D:\workspace\xxx‘; run ‘svn cleanup‘ firs
svn: E155004: There are unfinished work items in ‘D:\workspace\xxx‘; run ‘svn cleanup‘ firs
162 0
svn: E155004: There are unfinished work items in ‘D:\workspace\xxx‘; run ‘svn cleanup‘ firs
|
缓存 Go Docker
Docker - COPY & ADD
Docker - COPY & ADD
276 0
Docker - COPY & ADD
|
缓存 Linux Go
Dockerfile(10) - ADD 指令详解
Dockerfile(10) - ADD 指令详解
2336 0
|
Shell 容器
DOCKER04_详解Dockerfile基本指令、FROM、LABEL、RUN、CMD、ENTRYPOINT、ARG、ENV、VOLUME、USER(三)
③. RUN 构建时期运行的指令 ④. CMD(运行时期)、ENTRYPOINT 指定启动容器、镜像的默认入口
191 0
DOCKER04_详解Dockerfile基本指令、FROM、LABEL、RUN、CMD、ENTRYPOINT、ARG、ENV、VOLUME、USER(三)