多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
add于copy都可以用来: 1. 从dockerfile中构建 docker image时,将本地文件添加到镜像当中去,比如编译安装nginx的tar包,nginx的配置文件等,使得配置和安装更加的灵活。 2. 格式如下 ``` ADD <src> <dest> COPY <src> <dest> ``` ## 1. add ### 1.1 可以下载文件 ``` ADD http://foo.com/bar.go /tmp/main.go ``` 以上文件会通过制定的URL下载下来,并且添加到容器的文件系统中的/tmp/main.go路径中。另外一种形式是让你简单地制定目的目录为下载文件: ``` ADD http://foo.com/bar.go /tmp/ ``` 因为以 / 结尾 **Docker 会从URL推断文件名,并且添加到指定目录。** 在这个案例中,一个名叫/tmp/bar.go的文件会被添加到容器的文件系统。 ### 1.2 add 自动解压 *ADD的另外一个特性是有能力自动解压文件。* 如果参数是一个可识别的压缩格式(tar, gzip, bzip2, etc)的本地文件(所以实现不了同时下载并解压),就会被解压到指定容器文件系统的路径。 > ADD /foo.tar.gz /tmp/ 上述指令会使foo.tar.gz压缩文件解压到容器的/tmp目录。 **URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。** ## 2. copy 1. 在Docker 1.0发布时候,包括了新指令COPY。不像是ADD,**COPY 更加直接了当,只复制文件或者目录到容器里**。建议用copy,简单直接。 2. **COPY不支持URL,也不会特别对待压缩文件**。如果build 上下文件中没有指定解压的话,那么就不会自动解压,只会复制压缩文件到容器中。 COPY是ADD的一种简化版本,目的在于满足大多数人“复制文件到容器”的需求。使用哪个? 假如目前还不明显的话,那Docker 团队的建议是在大多数情况下使用COPY。 真的,使用ADD的唯一原因就是你有一个压缩文件,你想自动解压到镜像中。 OK,但是如果想要从远程URLS 中获取包的话,ADD还是没用么?技术上来说,是的。但是在大多数情况下,你更有可能运行curl或者wget。看看下面的例子吧: ``` ADD http://foo.com/package.tar.bz2 /tmp/ RUN tar -xjf /tmp/package.tar.bz2 \\ && make -C /tmp/package \\ && rm /tmp/package.tar.bz2 ``` 这里我们有一个ADD指令,用于解析URL的压缩包,紧接着是RUN指令,用于解压这个压缩包。然后编译并尝试删除下载的压缩包。 很不幸,当这个压缩包压缩后,rm命令处于独立的镜像层。。 在这个案例中,你组好这样做: ``` RUN curl http://foo.com/package.tar.bz2 \\ | tar -xjC /tmp/package \\ && make -C /tmp/package ``` 这里,我们curl 这个压缩包并且通过管道传给tar 命令解压。这样就在同一层镜像那么我们就可以删除压缩包了。 始终还是会有理由使用ADD 一个远程文件到你的镜像中,但是这个一个明确的决定,而不是默认的选择。 最后,只要认准一个原则:使用COPY(除非你明确你需要ADD)