Dockerfile 之ADD和COPY实战

Dockerfile 之ADD和COPY实战

前言

我们通过dockerfile 构建自己的私有镜像时,有时会往镜像里拷贝文件。在dockerfile中COPY和ADD可以实现将宿主机的文件拷贝到你需要制作的镜像里。二者很相似,单也有不同之处。另外对于源目标是文件还是目录,以及目的目标是文件还是目录二者也是有区别的。我会依次列举可能的情况并通过实战帮助理解。

ADD

  • ADD包含所有COPY的功能,并且可以将宿主机压缩文件拷贝到容器并且自动解压
  • ADD支持源文件来源于url ,可以wget下载源文件,然后拷贝到容器

使用场景:

1.如果源目标是文件,目的目标是以/结尾,此时代表目的目标是目录,会把源文件拷贝到该目录下

  • 目标目录存在

ADD index.html   /home/                          此时会在/home下看到index.html

  • 目标目录不存在

会自动创建不存在的目录,然后把文件拷进去。

2.如果源目标是文件,目的目标不是以/结尾  此时会当作是个文件,如果该文件不存在,则会在目的目标创建同名文件,文件内容和源文件相同。如果目标文件存在,则会将源文件内容覆盖到目标文件里去。

  • 目标文件不存在的情况

ADD index.html /home/test               test不存在时候,会创建test文件,然后内容是index.html的内容

  • 目标文件存在的情况

ADD index.html  /usr/share/nginx/html/index.html

容器内部有一个index.html文件,内容是Nginx欢迎页,我们对他覆盖。

 

重新构建镜像启动后查看内容已经覆盖

3.如果源文件是目录时候,此时结尾有无/意义都相同。都代表是目录

  • 目的目标对应目录不存在,则会在目的目标创建该不存在的目录,然后将源目录文件拷贝这个新创建的目录里去

注意:下图是原目录后面加了/   效果仍然一样。目标路径没有test目录

  • 如果目标路径存在

结果相同,我们的test目录依然没拷贝进去。

  • 如果想要出现test在目标也存在,则在目标路径也写一个test,他会发现目标路径没test目录,然后传创建,然后拷贝文件内容过去。

  • 如果test目录里还有目录,上述写法是否可以保证目录结构完整

此时test目录结构如下,里面包含目录2019,  然后2019目录下面还有文件ting

此时构建容器后进入容器查看,可以保证目录结构

总结

上述场景有些比较特殊,常规只需要注意:

如果在宿主机拷贝目录A进去,想要保证目的路径也有A目录则需要在目标路径最后,同样把A写上,否则只有A中的内容拷贝进去(末尾是否有 /  无所谓)

如果在宿主机拷贝文件A进去,如果你目的路径以/结尾 则是在这个目录下创建文件,如果以文件结尾,那就是把内容拷贝这个文件里而已。没有会自动创建这个文件。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...