Dockerfile中的COPY与ADD指令
0X00 就算只有一节我也要写标题
众所周知Dockerfile是构建Docker镜像的优良方式,而使用Dockerfile构建镜像最重要的就是为数不多的几个命令,而本次的主题COPY
和ADD
就是其中两个。我们知道这两个命令都是将文件搞到Docker镜像里用的,那究竟有没有区别,有什么区别呢?
首先我们看一下当前这个目录:
1 | λ ~/Workstadion/learn_docker ls |
我们有着么一个Dockerfile,可以看到是基于fedora
的一个镜像,并且将目录下的excited.tar
放进了创建好的shawn
目录中
1 | FROM fedora |
我们可以看到工作目录下已经存在了一个excited.tar
了,也就意味着我们成功将这个文件搞进去了。
1 | λ ~/Workstadion/learn_docker docker build . -t wtf ; docker rm learn_docker; docker run --name learn_docker -it wtf bash |
如果同样的操作用ADD
呢?看上去是类似的操作实际上并不是
1 | FROM fedora |
我们进到容器里可以看到打包文件被拆解了(压缩文件也会被解压)
1 | λ ~/Workstadion/learn_docker docker build . -t wtf ; docker rm learn_docker; docker run --name learn_docker -it wtf bash |
其实不止这样,ADD
命令还能下载文件:ADD https://too.young/too/simple.pdf /hello
就能将文件下载下来并且命名为hello
;如果是ADD https://too.young/too/simple.pdf /hello/
(只是最后多了斜杠),docker会认为你想将文件下载到/hello
的目录下,如果没有他会自己创建;还有我们不是说ADD
能下载文件还能解压文件吗,但是这两个又不能同时生效,意味着如果你想用ADD https://too.young/too/simple.zip /sometimes/naive/
将下载好的simple.zip
文件解压到/sometimes/naive/
目录里是不行的,最后结果只是将压缩包下载到了那个目录而已。
总结来说的话就是 COPY
简简单单复制,ADD
灵活多变。但是其实我们最好就直接用COPY
命令,真的需要解压什么的操作多写一个管道符也没有多麻烦。而且其他人看管道符后面接命令参数要比分析ADD
命令来的舒服得多。
算下来ADD
能做的没有什么是COPY
加管道做不了的。而且又加上ADD
的结果变换多端,不管是自己写还是其他人看都很麻烦,所以说大家能不用ADD
就不用了吧。