docker基础
01、Docker简介
02、Docker的安装(通过yum安装)
03、Docker安装的问题补充
04、Docker的安装(通过RPM软件包)
05、Docker的安装(通过脚本安装)
06、Docker的卸载
07、Docker配置阿里云镜像加速器
08、Docker中的基本概念和底层原理
09、Docker常用命令(帮助命令)
10、Docker常用命令(镜像命令)
11、Docker常用命令(容器命令01)
12、Docker常用命令(容器命令02)
13、Docker常用命令(容器命令03)
14、Docker安装Nginx
15、Docker图形化管理工具Portainer
16、Docker镜像讲解
17、Docker镜像分层的理解
18、Docker镜像的commit操作
19、Docker容器数据卷介绍
20、Docker容器数据卷的应用
21、Docker中数据卷相关命令
22、Docker数据卷实现MySQL数据持久化
23、DockerFile的方式挂载数据卷
24、Docker数据卷容器的说明与共享数据原理
25、DockerFile文件详解
26、Docker实战:自定义CentOS镜像
27、CMD指令和ENTRYPOINT指令的区别
28、ONBUILD指令介绍
29、COPY指令和ADD指令
30、自定义Tomcat9镜像
31、发布镜像到DockerHub
32、将本地镜像推送到阿里云
33、补充:save和load命令说明
34、Jenkins + Docker + Github 自动部署
本文档使用 MrDoc 发布
-
+
首页
29、COPY指令和ADD指令
### **1、COPY指令** **(1)COPY指令说明** `COPY` 指令从 `<src>` 复制新的文件或目录,并将它们添加到 Docker 容器文件系统的 `<dest>` 的路径下。 **(2)COPY指令格式** `COPY `有两种格式:(和 `RUN` 指令一样) COPY [–chown=`<user>`:`<group>`] `<src>`… `<dest>` COPY [–chown=`<user>`:`<group>`] ["`<src>`",… "`<dest>`"](包含空格的路径使用这种格式) 翻译一下: COPY [–chown=`<user>`:`<group>`] <源路径>… <目标路径> COPY [–chown=`<user>`:`<group>`] ["<源路径1>",… "<目标路径>"] **(3)COPY指令使用** `COPY` 指令将从构建上下文目录中 `<源路径>` 的文件或目录,复制到新的一层的镜像内的 `<目标路径>` 位置。 比如: ```python COPY package.json /usr/src/app/ ``` 1、 `<源路径>`:可以是多个,甚至可以是通配符,其通配符规则要满足Go的`filepath.Match`规则,; 如下: ```python COPY hom* /mydir/ COPY hom?.txt /mydir/ ``` 2、 `<目标路径>`:可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用`WORKDIR`指令来指定); 目标路径不需要事先创建,如果目录不存在,会在复制文件前先行创建缺失目录。 此外,还需要注意一点,使用 `COPY` 指令,**源文件**的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用,特别是构建相关文件都在使用 Git 进行管理的时候。 **(4)其他** 在使用该指令的时候还可以加上 `--chown=<user>:<group>` 选项,来改变文件的所属用户及所属组。 ```python COPY --chown=55:mygroup files* /mydir/ COPY --chown=bin files* /mydir/ COPY --chown=1 files* /mydir/ COPY --chown=10:11 files* /mydir/ ``` ### **2、ADD指令** `ADD `指令和 `COPY `指令的格式和性质基本一致,但是在 `COPY` 基础上增加了一些功能。 **(1)ADD指令说明** `ADD`指令有一些额外的功能 : - `ADD`指令可以让你使用 URL 作为 `<src>` 参数。当遇到 URL 时候,可以通过 URL 下载文件并且复制到 `<dest>`(容器中目标路径)。 - `ADD`的另一个特性是自动解压文件的能力。如果 `<src>` 参数是一个可识别压缩格式(tar, gzip, bzip2…)的**本地文件**(注:无法实现同时下载并解压),就会被解压到指定容器文件系统的路径 `<dest>` 下。 **即:`ADD`指令是将本地文件复制到容器中,也支持通过 URL 进行复制,但效率通常很低(不推荐使用)。** **(2)ADD指令格式** `ADD` 有两种格式: ADD [–chown=`<user>:<group>`] `<src>… <dest>` ADD [–chown=`<user>:<group>`] ["`<src>`",… "`<dest>`"](包含空格的路径使用这种格式) **(3)ADD指令使用** `ADD` 的最佳用途是将本地压缩包文件自动提取到镜像中: 如下情况,自动解压缩的功能非常有用,比如官方镜像 `ubuntu `中: ```python FROM scratch ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz / ... ``` **提示:但在某些情况下,如果我们真的是希望复制个压缩文件进去,而不解压缩,这时就不可以使用 `ADD` 命令了。** **(4)不推荐使用ADD指令下载文件的原因** 由于镜像的体积很重要,所以强烈建议不要使用 `ADD` 从远程 URL 获取文件,下载文件我们应该使用 `curl` 或 `wget` 来代替。 因为如果下载的是个压缩包,需要解压缩,还需要额外的一层 `RUN` 指令进行解压缩。所以不如直接使用 `RUN` 指令,然后使用 `wget` 或者 `curl` 工具下载,处理权限、解压缩、然后清理无用文件更合理。 因此,这个功能其实并不实用,而且不推荐使用。 示例: 我们应该避免以下操作:(Dockerfile文件) ```python ADD http://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things \ # 解压 && make -C /usr/src/things all \ # 编译 && rm -f /usr/src/things/big.tar.xz # 删除 ``` 这个压缩包解压后,`rm` 命令处于独立的镜像层。 我们可以这样做: ```python RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all ``` `curl` 会下载这个压缩包并通过管道传给 `tar` 命令进行解压,这样也就不会在文件系统中留下这个压缩文件了。 对于不需要自动解压的文件或目录,应该始终使用 `COPY`。 **最后,认准一个原则:总是使用 `COPY`(除非我们明确需要 `ADD`)。** **(5)其他** 在使用该指令的时候还可以加上 `--chown=<user>:<group>` 选项来改变文件的所属用户及所属组。 ```python ADD --chown=55:mygroup files* /mydir/ ADD --chown=bin files* /mydir/ ADD --chown=1 files* /mydir/ ADD --chown=10:11 files* /mydir/ ``` ### **3、总结:** 在Docker 官方的 `Dockerfile 最佳实践文档`中要求,尽可能的使用 `COPY`,因为 `COPY` 的语义很明确,就是复制文件而已,而 `ADD`则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 `ADD` 的场合,就是所提及的需要自动解压缩的场景。 另外需要注意的是,`ADD `指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。 因此在`COPY` 和` ADD` 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 `COPY` 指令,仅在需要自动解压缩的场景使用 `ADD`指令。 参考: - [https://www.kancloud.cn/spirit-ling/docker-study/1413262](https://www.kancloud.cn/spirit-ling/docker-study/1413262 "https://www.kancloud.cn/spirit-ling/docker-study/1413262") - [https://jpanj.com/2019/dockerfile-add-vs-copy/](https://jpanj.com/2019/dockerfile-add-vs-copy/ "https://jpanj.com/2019/dockerfile-add-vs-copy/")
李智
2025年3月17日 13:22
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码