语法
语法 1
ADD <src>... <dest>
语法 2
ADD ["<src>,... "<dest>"] (包含空格的路径需要此格式)
作用 & 描述
ADD 指令从指定 中复制新文件,目录或远程文件,并将它们添加到指定 路径上镜像的文件系统中;
可以指定多个资源,但如果它们是文件或目录,则它们必须相对于正在构建的源目录(构建上下文);
每个 都可能包含通配符,匹配将使用 Go 的 filepath.Match 规则完成;
ADD hom* /mydir/ # * 号匹配所有字符,添加所有以 hom 开头的文件到 /mydir/目录中
ADD hom?.txt /mydir/ # ? 问号匹配单个字符
是一个绝对路径或一个相对于 WORKDIR 的路径:
ADD test relativeDir # 将 “test” 添加到 `WORKDIR`/relativeDir/ 目录中
ADD test /absoluteDir/ # 将 “test” 添加到 /absoluteDir/ 目录中
添加包含特殊字符(例如:[ and ])的文件或目录时,需要按照Golang规则转义这些路径,以防止它们被视为某种模式。例如,要添加名为 arr[0].txt 的文件,请使用以下命令:
ADD arr[[]0].txt /mydir/ # 将文件名为 "arr[0].txt" 拷贝到 /mydir/ 目录中
当 是远程 URL 文件的情况下,目标将具有 600 权限。如果正在检索的远程文件具有 HTTP Last-Modified 标头,则来自该标头的时间戳将用于设置 mtime 目标文件。但是,与在处理期间处理的任何其他文件一样 ADD,mtime 将不包含在确定文件是否已更改且应更新回到缓存中。
注意
注意 1
如果通过传递 Dockerfile STDIN(docker build - < somefile)进行构建,则没有构建上下文,因此Dockerfile只能包含基于 URL 的 ADD 指令。你还可以通过 STDIN:(docker build - < (archive.tar.gz)传递压缩文档 Dockerfile,该存档诶与存档的根目录,其余存档将用作构建的上下文。
注意 2
如果你的网址文件都使用认证保护,你讲需要使用 RUN get,RUN curl 或使用其它工具,容器内的 ADD 指令不支持验证。
注意 3
ADD 如果内容已更改,则第一个遇到的指令将使来自Dockerfile的所有后续指令的告诉缓存无效。这包括使缓存无效以获取 RUN 指令。有关详细信息,请参阅 ”Dockerfile 最佳实践指南“
注意 4
- 路径必须位于构建的上下文中,不能添加 …/something /something,因为docker构建的第一步是将上下文目录(子目录)发送到docker守护进程;
- 如果是URL且不以 / 结尾,则从 URL 下载文件将其复制到;
- 如果是URL并且以 / 结尾,则从 URL 腿短文件名,并将文件下载到/。例如:ADD http://example.com/foobar/ 将创建文件/foobar。URL必须具有非常重要的路径,以便在这种情况下可以发现适当的文件名(http://example.com将不起作用);
- 如果是目录,则复制目录的全部内容,包括文件系统元数据;
注意 5
不复制目录本身,值复制其内容;
注意 6
如果是以可识别的压缩格式(identity, gzip, bzip2 或 xz)的本地tar存档,则将其解压缩为目录。远程 URL 中的资源不会被解压缩。复制或解压缩目录时,它具有相同的行为 tar -x ,结果是:
- 无论在目标路径上存在什么
- 源树的内容,在逐个文件的基础上解决了有利于"2."的冲突
注意:
文件是否被表示为可识别的压缩格式仅基于文件的内容而不是文件的名称来完成。例如,如果一个空文件碰巧以此结束,.tar.gz 则不会将其识别为压缩文件,也不会生成任何类型的解压缩错误消息,而是将文件简单地复制到目标。 - 如果是任何其它类型的文件,则将其与元数据一起单独复制。在这种情况下,如果以尾部/结束,则将其视为目录,并将写入内容/base()
- 如果直接或由使用通配符指定了多个资源,则必须是目录,并且必须以斜杠 / 结尾
- 如果不以尾部斜杠结束,则将其视为常规文件,的内容将写入
- 如果不存在,则会在其路径中创建所有缺少的目录