dockerfile深入学习之ADD

ADD命令的作用是将源路径下的文件或目录拷贝到docker镜像的指定目标目录下
形式:
1 ADD <src>... <dest>
2 ADD ["<src>",... "<dest>"] ("此种情况用于路径中包含空白")
src:源路径,可以是文件、目录、或者远程URL
dest:目标路径
可以指定多个<src>的资源
每个src都可以包含通配符、如下:
ADD hom* /mydir/
ADD hom?.txt /mydir/
如果src包含通配符、其匹配规则遵循golang filepath.Match
<dest>可以是绝对路径或者目标容器中的相对路径
ADD test relativeDir/ # adds "test" to WORKDIR/relativeDir/(相对路径)
ADD test /absoluteDir/ # adds "test" to /absoluteDir/(绝对路径)
如果路径中带有转义字符,则可以根据golang规则进行转义
ADD arr[[]0].txt /mydir/ #添加一个文件名称为arr[0].txt到镜像中
所有目标路径下的新的文件和目录都是使用UID和GID创建的,因此,如果src是远程URL形式,目标路径将拥有600的权限,如果在该URL中检索到HTTP的Last-Modified头,则报头的时间用于设置目标文件的mtime值
注意:mtime的用法不再是HTTP中的用法,它不参与决定文件是否已改变或者缓存应该更新
Note:
1、如果是通过stdin输入指定Dockerfile的方式构建镜像(docker build - < somefile),不会有构建上下文,所以Dockerfile只能包含一个基于URL的ADD指令
也可以通过STDIN传入压缩文件(docker build - < archive.tar.gz),archive根目录下的docker和archive其余部分将被用于构建上下文
2、如果URL文件受到身份认证保护,则需要使用 RUN wget, RUN curl或者容器内其它工具,因为 ADD指令不支持验证
3、如果<src>的内容发生了变化,遇到的第一条ADD指令将使Dockerfile的所有后续指令的缓存无效。 这包括使RUN指令的缓存无效。
ADD指令遵循以下规则:
1、<src>路径必须位于构建的上下文中;不能使用 ADD ../something /something 这样的方式,因为docker构建的第一步是发送上下文的目录和子目录到docker守护进程中
2、如果<src>是一个URL,并且dest没有以"/"结尾,ADD将会从URL中下载文件然后拷贝到<dest>下
3、如果<src>是一个URL,并且dest没有以"/"结尾,则文件名从URL中推断,文件下载到<dest>/<filename>
ADD http://example.com/foobar 会生成文件 /foobar
4、如果<src>是一个目录,则该目录下所有内容,名手文件系统元数据都会被拷贝
Note:目录本身不被拷贝,只拷贝目录下的内容
5、如果<src>是一个可识别的压缩包形式,将会被解压为一个目录,远程URL的资源不会被解压,当目录被复制或解压时产生tar -x的效果、结果是:
无论目的地路径和源树的内容如何,在逐个文件的基础上解决。
Note:此处文件是否被识别为压缩格式取决于其文件内容,而不是文件名(一个空文件 :以.tar.gz结尾,不会被识别为一个压缩文件)
6、如果<src>是任何其它类型的文件,则其会与其元数据一起单独复制,如果<dest>以"/"结尾,则会被看作一个目录,<src>下的内容会被写入到<dest>/base<src>
7、如果指定了多个<src>资源,<dest>必须是以"/"结尾的目录
8、如果<dest>不以"/"结尾,则它会被认为是一个常规文件,<src>的内容将会被写入到<dest>文件中
9、如果<dest>不存在,则它与其路径中所有缺少的目录(<src>中包含的目录)一起创建