DockerFile的ADD和COPY的区别

简介: DockerFile的ADD和COPY的区别

Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的。


COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。Docker开发者推荐:满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩。


但是ADD指令有如下的优越性:


  • 1、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。

如果目标路径不存在,则会自动创建目标路径。


  • 2、如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。

如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;

如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。

如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。


  • 3、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。

如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。


  • 4、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。


上面的优势也是ADD劣势,很多时候我们不希望复制进docker的压缩包解压缩,那么怎么办呢,这就是COPY的存在的合理性。




COPY指令和ADD指令的用法非常相似,具体注意事项如下:


  • 源路径可以有多个
  • 源路径是相对于执行build的相对路径
  • 源路径如果是本地路径,必须是build上下文中的路径
  • 源路径如果是一个目录,则该目录下的所有内容都将被加入到容器,但是该目录本身不会
  • 目标路径必须是绝对路径,或相对于WORKDIR的相对路径
  • 目标路径如果不存在,则会创建相应的完整路径
  • 目标路径如果不是一个文件,则必须使用/结束
  • 路径中可以使用通配符
目录
相关文章
|
缓存 Linux Go
Dockerfile(11) - COPY 指令详解
Dockerfile(11) - COPY 指令详解
2813 0
|
缓存 开发工具 git
报错:Git上传代码报错 will not add file alias already exists in index
报错:Git上传代码报错 will not add file alias already exists in index
454 0
|
3月前
|
缓存 Docker 容器
在Docker中,docker add copy有什么区别?
在Docker中,docker add copy有什么区别?
|
3月前
|
Docker 容器
Docker export 和 save 区别
【8月更文挑战第3天】`docker export` 与 `docker save` 的关键区别在于处理对象和用途。`export` 将容器转为 `.tar` 文件,仅导出容器文件系统,不含元数据,适合快速备份或测试;`save` 则打包整个镜像及其元数据为 `.tar` 文件,用于镜像迁移或离线备份。前者通过 `import` 创建新镜像但无元数据,后者用 `load` 恢复完整镜像。
353 1
|
5月前
|
存储 Python
copy
【6月更文挑战第10天】
32 0
|
6月前
|
算法 安全 Linux
Ansible 中的copy 复制模块应用详解
Ansible 中的copy 复制模块应用详解
429 1
|
缓存 Linux Docker
44-Dockerfile-ADD/COPY指令
44-Dockerfile-ADD/COPY指令
|
6月前
|
算法 C++ 容器
【C++11算法】find_if_not、 copy_if、copy_n
【C++11算法】find_if_not、 copy_if、copy_n
118 0
--save 和 --save-dev简述
--save 和 --save-dev简述
119 0
--save 和 --save-dev简述
|
缓存 Go Docker
Docker - COPY & ADD
Docker - COPY & ADD
272 0
Docker - COPY & ADD