ADD
ADD有两种形式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
(这种形式paths要包含空格)
ADD
命令复制文件,目录或者URL中的远程文件从<src>
当中,把他们添加到镜像的文件系统中,在<dest>
位置。
多个<src>
是允许的,但是如果他们是文件和目录的话,则他们必须要属于构建的源目录(build的上下文)。
每个<src>
都可能包含通配符和匹配使用Go语言的filepath.Match 规则。
例如:
ADD hom* /mydir/ # adds all files starting with "hom"
ADD hom?.txt /mydir/ # ? is replaced with any single character, e.g., "home.txt"
<dest>
是绝对路径,或者相对于WORKDIR
的路径,源文件会被拷贝到目标容器的这个路径里。
ADD test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # adds "test" to /absoluteDir/
所有文件和目录创建时的UID和GID都是0。
在<src>
是URL的情况下,目标会拥有600的权限。如果远程文件被标记有HTTP的Last-Modified
,目标文件的mtime
会被设置为HTTP请求头中的时间戳。尽管,其他使用ADD
处理的文件,mtime
不会包含在目标处理中,不管那个文件是否改变或者cache应该要刷新。
注意:如果你build
Dockerfile
通过STDIN(docker build - < somefile
),这里是没有上下文的,因此Dockerfile
只能通过URL进行ADD
。你也可以通过STDIN传入一个压缩文件(docker build - < archive.tar.gz
),而存档的根目录将作为构建的上下文使用。注意 :如果你的网址有认证保护,你需要用
RUN wget
,RUN curl
或者其他工具来进行添加,而不是利用ADD
,ADD
不支持认证。注意: 如果
<src>
中的内容已经更改,那么第一条ADD
指令会使Dockerfile
中以后的指令缓存无效,这同样会使RUN
指令的cache无效。参阅Dockerfile
的最佳实践获取更多信息。
ADD
遵守以下的规则:
<src>
必须是build的上下文;你不能ADD ../something /something
,因为docker build
的第一步是发送上下文到docker daemon。- 如果
<src>
是一个URL并且<dest>
没有一个结尾斜杠,那么会把URL中的文件下载下来,然后复制到<dest>
当中。 - 如果
<src>
是一个URL并且<dest>
有一个结尾斜杠,那么文件名将会从URL中得出,并且下载到<dest>/<filename>
。例如,ADD http://example.com/foobar /
会创建文件/foobar
。那个URL必须是一个有path的URL,从而能够推断出filename。(http://example.com
不会工作 )。 - 如果
<src>
是一个目录,那整个目录的内容都会被下载下来,包括文件系统的元数据。
注意 :目录本身是不会复制的,只是他的内容。
如果
<src>
是一个本地tar格式,或者可以被识别的其他压缩格式(identity,gzip,bzip2或者xz)那么他会被解压成一个目录。远程URL中的资源是不 会解压的。当一个目录被复制或者解压,他们会和tar -x
有相同的行为,结果是下面的组合: 1.无论目标目录存在什么
2.根据目录的内容,一个一个文件的解决冲突。
注意:文件是否被识别为压缩文件是根据文件的内容的决定的,而不是文件的名称。例如,一个空文件以
.tar.gz
结尾是不会被识别为压缩文件的,同样不会产生任何的解压错误,而会直接将文件复制到目标目录。如果
<src>
是其他类型的文件,他会带着他的元数据一起进行拷贝。在这种情况下如果<dest>
以/
结尾,他会被当做一个目录,<src>
中的内容会被复制到<dest>/base(<src>)
。如果存在了多个
<src>
,或者直接或间接的使用了通配符,那么<dest>
必须是一个目录,并且他必须以/
结尾。如果
<dest>
没有一个结尾斜杠,他会被当做一个常规的文件,并且<src>
中的内容会被写到<dest>
中。如果
<dest>
不存在,那会在他的路径中创建所有缺少的目录。