Dockerfile COPY、ADD 作用和区别

这篇具有很好参考价值的文章主要介绍了Dockerfile COPY、ADD 作用和区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此文章会帮助你理清Dockerfile中非常相似的两个指令(instructions):ADDCOPY。包含为什么Dockerfile中会出现两个功能如此相似的指令,以及日常使用中应该使用哪种更好。

当我们构建Docker image时,经常添加目录/文件至image中。此时便有了两种指令可选择:ADDCOPY。两种指令有着几乎相同的语法,且可以完成几乎相同的功能:

ADD <src>... <dest>
COPY <src>... <dest>

在这两种情况下,目录或文件<src>被复制并添加到容器的文件系统中指定的<dest>路径。 

ADD

COPY不同,ADD一开始便是Docker的一部分。除了简单的在构建中复制文件,ADD还有一些其他的小功能:

URL

ADD指令允许用户使用URL地址作为<src>参数,当获取到URL时,会从该URL下载一个文件并复制到<dest>

ADD http://foo.com/bar.go /tmp/main.go

上述语句会从URL foo.com下载文件,并添加到容器中文件系统下 /tmp/main.go<dest>也可以指定目标目录,表示下载文件存储至该目录下:

ADD http://foo.com/bar.go /tmp/

上述语句因为<dest>以斜杠( / )结尾,Docker将从URL获取到文件名,并将其添加到指定目录中。在本例中,命名为/tmp/bar.go的文件将被添加到容器的文件系统中。

unpacked  解压缩文件

ADD指令的另一个特性是自动解压缩文件。当<src>参数是一个可识别压缩格式(tar, gzip, bzip2, etc)的本地文件,那么它会被解压缩后添加至容器的文件系统中:

ADD /foo.tar.gz /tmp/

上述命令会将foo.tar.gz文件的内容被解压缩到容器的/tmp目录中。

不过,URL下载与自动解压缩特性不能同时使用,任何从URL下载的压缩文件都不会被自动解压缩。

 

 

COPY

显然,一个简单的ADD指令背后却有很多功能。虽然这使ADD相当通用,但同时使它有些不可预测。以下是2013年12月记录在ADD命令上的一个问题:

Currently the ADD command is IMO far too magical. It can add local and remote files. It will sometimes untar a file and it will sometimes not untar a file. If a file is a tarball that you want to copy, you accidentally untar it. If the file is a tarball in some unrecognized compressed format that you want to untar, you accidentally copy it.

目前ADD命令在我看来太神奇了。它可以添加本地和远程文件。它有时会解压缩文件,有时不会解压缩文件。如果一个文件是您想要复制的tarball文件,您会不小心解压缩它。如果该文件是某种无法识别的压缩格式的tarball文件,而您想要解压缩它,则会意外地复制它

人们的共识似乎是ADD试图做的太多,让用户感到困惑。而且,没有人想要打破ADD现有用法的向后兼容性,因此决定添加一条行为更可预测的新指令,COPY

当Docker 1.0版本发布时,也同时发布了一条新指令COPY。与ADD不同,COPY只是简单的将目录/文件原封不动的拷贝至容器中。

COPY不支持URL作为<src>的参数,所以它无法从远程下载文件,任何你想通过COPY添加至容器的目录/文件必须在本地主机中。

同时,COPY也不支持自动解压缩文件。如果你指定的<src>参数是一个压缩文件,COPY会直接将该文件添加至容器中,而不会去尝试解压缩它。

实际上COPY可以理解为ADD的精简版,它的意义在于毫无意外的满足 将目录/文件复制到容器 这一简单场景,不会像ADD可能会发生意料之外的情况。

 

 

如何选择

如果你还不清楚自己该使用哪个,Docker团队的建议是尽量在所有场景下都是用COPY。即便是需要添加远程文件至容器中,更多情况下更推荐使用RUN 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指令,解压缩后尝试清理掉它。但实际上,由于压缩包检索(package retrieval)与rm命令在不同的层(layers)中,该命令不会对最终构建的image减少任何空间(该问题涉及docker 构建原理,详细说明可以参考该文章:Optimizing Docker Images )

所以在这种情况下,更好的做法是:

RUN curl http://foo.com/package.tar.bz2 \
  && tar -xjC /tmp/package \
  && make -C /tmp/package

使用RUN指令,curl下载压缩包通过管道直接将其导入tar命令中进行提取。这样,我们就不会在文件系统上留下需要清理的存档文件。

总之,在任何情况下都是用COPY(除非你确定你真的需要ADD

参考: https://www.ctl.io/developers/blog/post/dockerfile-add-vs-copy/文章来源地址https://www.toymoban.com/news/detail-861860.html

到了这里,关于Dockerfile COPY、ADD 作用和区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Dockerfile 与 Docker Compose区别

    目录 Dockerfile Docker Compose 综合比较 Dockerfile 用途: Dockerfile 用于定义单个容器的构建过程。它包含了一系列指令,每个指令都代表容器构建过程中的一个步骤。这些步骤包括从基础镜像中构建、安装依赖、拷贝文件、设置环境变量等操作。 语法: Dockerfile 是一个文本文件,其

    2024年02月05日
    浏览(13)
  • Dockerfile 指令 COPY 拷贝文件夹

    网上查了查资料,这里记录一下。         今天在编写 dockerfile 时使用 COPY 拷贝文件夹时遇到了意料之外的情况。在此记录一下正确的使用方法。         今天在通过 dockerfile 将文件夹拷贝到镜像的时候发现,是把文件夹下的内容拷贝进去了。 dockerfile 如下:     

    2024年01月18日
    浏览(12)
  • docker的联合文件系统 UnionFS《深入docker底层原理》

    docker最大的贡献就是定义了容器镜像的分层的存储格式,docker镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。 联合挂载系统的工作原理:读:如果文件在upperdir(容器)层,直接读取文件;如果文件不在u

    2024年02月13日
    浏览(16)
  • Docker 魔法解密:探索 UnionFS 与 OverlayFS

    本文主要介绍了 Docker 的另一个核心技术:Union File System。主要包括对 overlayfs 的演示,以及分析 docker 是如何借助 ufs 实现容器 rootfs 的。 如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注微信公众号。 搜索公众号【 探索云原生 】即可订阅 Unio

    2024年01月19日
    浏览(10)
  • docker核心原理——unionfs、namespace、cgroup

    docker的核心原理其实就是cgroup+namespace+unionfs 组合实现的隔离机制,资源控制等。 隔离机制 在容器进程启动之前重新挂载它的整个根⽬录“/”,⽤来为容器提供隔离后的执⾏环境⽂件系统 通过Linux Namespace 创建隔离,决定进程能够看到和使⽤哪些东⻄。 通过control groups 技术来

    2024年02月04日
    浏览(29)
  • 【运维】dockerfile 中的COPY 会覆盖文件夹吗

    Dockerfile 中的 COPY 命令会根据指定的源路径将文件或文件夹复制到容器中的目标路径。行为取决于两个因素:源路径和目标路径以及目标路径的类型。 源路径是文件,目标路径是文件: 如果源路径是文件,目标路径也是文件,则 COPY 命令会将源文件复制到目标路径,并覆盖目

    2024年01月25日
    浏览(16)
  • docker 系列之 Dockerfile 文件里 cmd命令与entrypoint命令区别

    cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。重点就是这个“默认”。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行。同时也从侧面说明了entrypoint的含义,它

    2024年02月05日
    浏览(15)
  • docker运行java程序的Dockerfile

    2024年01月18日
    浏览(9)
  • 【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)

    镜像结构 Dockerfile 语法 构建 Java 项目 ① 之前使用的镜像都是 DockerHub 官方提供的 ② 开发者需要将自己的微服务制作为镜像 镜像 是由 应用程序 及其需要的 系统函数库 、 环境 、 配置 、 依赖 打包而成。 📝 镜像是 分层结构 ,每一层称为一个 Layer 1️⃣ BaseImage 层:包含基

    2024年02月03日
    浏览(10)
  • Docker DockerFile部署java jar项目包,以及Mysql,Redis

    Docker 运行环境要求系统为 64 位、 Linux 系统内核版本为  3.8 以上 1.1 搭建gcc环境 (gcc是编程语言译器) yum -y install gcc yum -y install gcc-c++ 1.2 安装需要的软件包 yum install -y yum-utils 1.3 装镜像仓库 因为docker的服务器是在国外, 所以有时候从仓库中下载镜像的时候会连接被拒绝或者连

    2024年02月05日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包