iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >Dockerfile中的COPY与ADD命令怎么用
  • 131
分享到

Dockerfile中的COPY与ADD命令怎么用

2024-04-02 19:04:59 131人浏览 薄情痞子
摘要

这篇文章主要介绍了Dockerfile中的COPY与ADD命令怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Dockerfile中的COPY与ADD命令怎么用文章都会有所

这篇文章主要介绍了Dockerfile中的COPY与ADD命令怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Dockerfile中的COPY与ADD命令怎么用文章都会有所收获,下面我们一起来看看吧。

build 上下文的概念

在使用 docker build 命令通过 dockerfile 创建镜像时,会产生一个 build 上下文(context)。所谓的 build 上下文就是 docker build 命令的 path 或 url 指定的路径中的文件的集合。在镜像 build 过程中可以引用上下文中的任何文件,比如我们要介绍的 copy 和 add 命令,就可以引用上下文中的文件。

默认情况下 docker build -t testx . 命令中的 . 表示 build 上下文为当前目录。当然我们可以指定一个目录作为上下文,比如下面的命令:

$ docker build -t testx /home/nick/hc

我们指定 /home/nick/hc 目录为 build 上下文,默认情况下 docker 会使用在上下文的根目录下找到的 dockerfile 文件。

copy 和 add 命令不能拷贝上下文之外的本地文件

对于 copy 和 add 命令来说,如果要把本地的文件拷贝到镜像中,那么本地的文件必须是在上下文目录中的文件。其实这一点很好解释,因为在执行 build 命令时,docker 客户端会把上下文中的所有文件发送给 docker daemon。考虑 docker 客户端和 docker daemon 不在同一台机器上的情况,build 命令只能从上下文中获取文件。如果我们在 dockerfile 的 copy 和 add 命令中引用了上下文中没有的文件,就会收到类似下面的错误:

Dockerfile中的COPY与ADD命令怎么用

与 workdir 协同工作

workdir 命令为后续的 run、cmd、copy、add 等命令配置工作目录。在设置了 workdir 命令后,接下来的 copy 和 add 命令中的相对路径就是相对于 workdir 指定的路径。比如我们在 dockerfile 中添加下面的命令:

workdir /app
copy checkRedis.py .

然后构建名称为 testx 的容器镜像,并运行一个容器查看文件路径:

Dockerfile中的COPY与ADD命令怎么用

checkredis.py 文件就是被复制到了 workdir /app 目录下。

copy 命令的简单性

如果仅仅是把本地的文件拷贝到容器镜像中,copy 命令是最合适不过的。其命令的格式为:
copy <src> <dest>

除了指定完整的文件名外,copy 命令还支持 Go 风格的通配符,比如:

copy check* /testdir/           # 拷贝所有 check 开头的文件
copy check?.log /testdir/       # ? 是单个字符的占位符,比如匹配文件 check1.log

对于目录而言,copy 和 add 命令具有相同的特点:只复制目录中的内容而不包含目录自身。比如我们在 dockerfile 中添加下面的命令:

workdir /app
copy nickdir .

其中 nickdir 目录的结构如下:

Dockerfile中的COPY与ADD命令怎么用

重新构建镜像 testx,运行一个容器并查看 /app 目录下的内容:

Dockerfile中的COPY与ADD命令怎么用

这里只有 file1 和 file2,少了一层目录 nickdir。如果想让 file1 和 file2 还保存在 nickdir 目录中,需要在目标路径中指定这个目录的名称,比如:

workdir /app
copy nickdir ./nickdir

copy 命令区别于 add 命令的一个用法是在 multistage 场景下。关于 multistage 的介绍和用法请参考笔者的《dockerfile 中的 multi-stage》一文。在 multistage 的用法中,可以使用 copy 命令把前一阶段构建的产物拷贝到另一个镜像中,比如:

from golang:1.7.3
workdir /go/src/GitHub.com/sparkdevo/href-counter/
run go get -d -v golang.org/x/net/html
copy app.go    .
run cgo_enabled=0 goos=linux go build -a -installsuffix cgo -o app .
from alpine:latest
run apk --no-cache add ca-certificates
workdir /root/
copy --from=0 /go/src/github.com/sparkdevo/href-counter/app .
cmd ["./app"]

这段代码引用自《dockerfile 中的 multi-stage》一文,其中的 copy 命令通过指定 --from=0 参数,把前一阶段构建的产物拷贝到了当前的镜像中。

add 命令还可以干其它事情

add 命令的格式和 copy 命令相同,也是:

add <src> <dest>

除了不能用在 multistage 的场景下,add 命令可以完成 copy 命令的所有功能,并且还可以完成两类超酷的功能:

•解压压缩文件并把它们添加到镜像中
•从 url 拷贝文件到镜像中

当然,这些功能也让 add 命令用起来复杂一些,不如 copy 命令那么直观。

解压压缩文件并把它们添加到镜像中

如果我们有一个压缩文件包,并且需要把这个压缩包中的文件添加到镜像中。需不需要先解开压缩包然后执行 copy 命令呢?当然不需要!我们可以通过 add 命令一次搞定:

workdir /app
add nickdir.tar.gz .

这应该是 add 命令的最佳使用场景了!

从 url 拷贝文件到镜像中

这是一个更加酷炫的用法!但是在的最佳实践中却强烈建议不要这么用!!docker 官方建议我们当需要从远程复制文件时,最好使用 curl 或 wget 命令来代替 add 命令。原因是,当使用 add 命令时,会创建更多的镜像层,当然镜像的 size 也会更大(下面的两段代码来自 docker 官方文档):

add  /usr/src/things/
run tar -xjf /usr/src/things/big.tar.xz -c /usr/src/things
run make -c /usr/src/things all

如果使用下面的命令,不仅镜像的层数减少,而且镜像中也不包含 big.tar.xz 文件:

run mkdir -p /usr/src/things \
    && curl -sl  \
    | tar -xjc /usr/src/things \
    && make -c /usr/src/things all

好吧,看起来只有在解压压缩文件并把它们添加到镜像中时才需要 add 命令!

加速镜像构建的技巧

在使用 copy 和 add 命令时,我们可以通过一些技巧来加速镜像的 build 过程。比如把那些最不容易发生变化的文件的拷贝操作放在较低的镜像层中,这样在重新 build 镜像时就会使用前面 build 产生的缓存。比如笔者构建镜像时需要用到下面几个文件:

Dockerfile中的COPY与ADD命令怎么用

其中 myhc.py 文件不经常变化,而 checkmongo.py、checkMysql.py 和 checkredis.py 这三个文件则经常变化,那么我们可这样来设计 dockerfile 文件:

workdir /app
copy myhc.py .
copy check* ./

让 copy myhc.py . 单独占据一个镜像层,当 build 过一次后,每次因 checkmongo.py、checkmysql.py 和 checkredis.py 这三个文件变化而导致的重新 build 都不会重新 build copy myhc.py . 镜像层:

Dockerfile中的COPY与ADD命令怎么用

如上图所示,第二步和第三步都没有重新 build 镜像层,而是使用了之前的缓存,从第四步才开始重新 build 了镜像层。当文件 size 比较大且文件的数量又比较多,尤其是需要执行安装等操作时,这样的设计对于 build 速度的提升还是很明显的。所以我们应该尽量选择能够使用缓存的 dockerfile 写法。

关于“Dockerfile中的COPY与ADD命令怎么用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Dockerfile中的COPY与ADD命令怎么用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网VUE频道。

--结束END--

本文标题: Dockerfile中的COPY与ADD命令怎么用

本文链接: https://www.lsjlt.com/news/96726.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Dockerfile中的COPY与ADD命令怎么用
    这篇文章主要介绍了Dockerfile中的COPY与ADD命令怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Dockerfile中的COPY与ADD命令怎么用文章都会有所...
    99+
    2022-10-19
  • Dockerfile中ADD和COPY指令有什么用
    这篇文章主要介绍Dockerfile中ADD和COPY指令有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!当从Dockerfile 中 build Docker 镜像时候,你可以选择两种指令来添加本地的目录或者...
    99+
    2023-06-04
  • 怎么使用PostgreSQL中的COPY命令
    这篇文章主要讲解了“怎么使用PostgreSQL中的COPY命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用PostgreSQL中的COPY命令”...
    99+
    2022-10-18
  • docker中Dockerfile的ONBUILD命令怎么用
    这篇文章将为大家详细讲解有关docker中Dockerfile的ONBUILD命令怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。    ONBUILD:当构建...
    99+
    2023-06-04
  • Linux的ssh-add命令怎么使用
    本篇内容主要讲解“Linux的ssh-add命令怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux的ssh-add命令怎么使用”吧!Linux常用命令ssh-add命令是把专用密钥...
    99+
    2023-06-28
  • dos中文件复制copy命令怎么用
    这篇文章主要为大家展示了“dos中文件复制copy命令怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“dos中文件复制copy命令怎么用”这篇文章吧。假设,你需要把d:\test\test....
    99+
    2023-06-09
  • Linux中ssh-add命令有什么用
    这篇文章给大家分享的是有关Linux中ssh-add命令有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux常用命令ssh-add命令 是把专用密钥添加到ssh-agent的高速缓存中。该命令位置在/...
    99+
    2023-06-28
  • Linux中ssh-copy-id命令有什么用
    这篇文章主要介绍了Linux中ssh-copy-id命令有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Linux常用命令ssh-copy-id命令 可以把本地主机的公...
    99+
    2023-06-28
  • Dockerfile的CMD指令怎么使用
    这篇文章主要介绍“Dockerfile的CMD指令怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Dockerfile的CMD指令怎么使用”文章能帮助大家解决问题。一 Docker的CMD指令...
    99+
    2023-07-05
  • tar命令与rpm命令怎么在linux中使用
    tar命令与rpm命令怎么在linux中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一. tar  1.压缩一组文件为tar.gz后缀。  # tar...
    99+
    2023-06-13
  • linux中expand与unexpand命令怎么用
    这篇文章给大家分享的是有关linux中expand与unexpand命令怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。expand 命令示例与我之前提到的一样,expand 命令使用空格替换文件中的 TAB...
    99+
    2023-06-16
  • Linux中&与nohup命令怎么用
    这篇文章主要为大家展示了“Linux中&与nohup命令怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中&与nohup命令怎么用”这篇文章吧。我们以下面一个tes...
    99+
    2023-06-15
  • Linux中chgrp与chown命令怎么用
    这篇文章主要介绍Linux中chgrp与chown命令怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!chgrp命令功能:改变文件或目录所属的组。语法:chgrp [选项] group filename该命令改变...
    99+
    2023-06-16
  • Linux中的export与alias命令怎么使用
    这篇文章主要讲解了“Linux中的export与alias命令怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中的export与alias命令怎么使用”吧!摘要:export...
    99+
    2023-07-05
  • Linux命令中的rpm命令怎么用
    这篇文章的内容主要围绕Linux命令中的rpm命令怎么用进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!在Linux中,RPM是进行软件得安装、卸载、...
    99+
    2023-06-28
  • diff与comm命令怎么在linux中使用
    diff与comm命令怎么在linux中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代码作用:比较两个UNIX文本文件,找出并打印文本2比文本1新增加的内容。代码调用...
    99+
    2023-06-13
  • vertica数据库copy命令是实现数据加载的代码怎么写
    vertica数据库copy命令是实现数据加载的代码怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。vertica数据加载创建外部数据文本:[dbadmin...
    99+
    2023-06-02
  • Linux的查找命令locate与find怎么用
    这篇文章主要介绍“Linux的查找命令locate与find怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux的查找命令locate与find怎么用”文章能帮助大家解决问题。locate...
    99+
    2023-06-27
  • shell怎么记录用户的IP与命令
    这篇文章将为大家详细讲解有关shell怎么记录用户的IP与命令,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。记录输入的命令history命令可以查看用户输入过的命令,一个典型history命令输出如下:9...
    99+
    2023-06-09
  • Node.js中的package.json与cnpm命令行工具怎么使用
    这篇“Node.js中的package.json与cnpm命令行工具怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“N...
    99+
    2023-07-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作