Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Dockerfile(11) - COPY 指令详解

Dockerfile(11) - COPY 指令详解

作者头像
小菠萝测试笔记
发布于 2021-11-02 08:18:41
发布于 2021-11-02 08:18:41
32.3K00
代码可运行
举报
运行总次数:0
代码可运行

一段话总结完 COPY

  • 作用:复制内容到镜像
  • 格式:

COPY <src> <dest>

  • 详解:复制本地主机的 <src>下内容到镜像中的 <dest>,目标路径不存在时,会自动创建。
  • <src>:可以是 Dockerfile 所在目录的一个相对路径(文件或目录)
  • <dest>:可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对路径
  • 路径:支持正则表达式,

COPY test* /tmp

两种格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
--chown

仅适用于 linux 上的 dockerfile,在 window 上没有用户、组的概念

COPY 作用
  • COPY 指令从 <src> 复制新文件、目录或远程文件 URL,并将它们添加到路径 <dest>
  • 可以指定多个 <src> 资源,但如果它们是文件或目录,则它们的路径被解析为相对于构建上下文的源
  • 每个 <src> 可能包含通配符,匹配将使用 Go 的 filepath.Match 规则完成

简单栗子

* 通配符

把所有 hom 开头的文件复制到镜像文件系统的 /mydir/ 目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY hom* /mydir/
? 通配符

? 匹配 0 或 1 个字符,比如会把 home.txt 文件复制到 /mydir/ 目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY hom?.txt /mydir/

重点

<dest> 是绝对路径,或相对于 WORKDIR 的路径,源将在目标容器内复制到该路径中

使用相对路径的栗子
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY test.txt relativeDir/

等价于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY test.txt <WORKDIR>/relativeDir/
使用绝对路径的栗子

将 test.txt 添加到 /absoluteDir/ 目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY test.txt /absoluteDir/

包含特殊字符的文件

添加名为 arr[0].txt 的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY arr[[]0].txt /mydir/

标志 --from=<name>

将从 from 指定的构建阶段中寻找源文件 <src>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 第一构建阶段:将仅用于生成 requirements.txt 文件
FROM tiangolo/uvicorn-gunicorn:python3.9 as requirements-stage

# 将当前工作目录设置为 /tmp
WORKDIR /tmp

# 生成 requirements.txt
RUN touch requirements.txt

# 第二构建阶段,在这往后的任何内容都将保留在最终容器映像中
FROM python:3.9

# 将当前工作目录设置为 /code
WORKDIR /code

# 从第一个阶段复制 requirements.txt;这个文件只存在于前一个 Docker 阶段,这就是使用 --from-requirements-stage 复制它的原因
COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt

# 运行命令
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

COPY 遵循的规则

<src> 路径必须在构建的上下文中

不能添加 ../something 、 /something ,因为 docker 构建的第一步是将上下文目录(和子目录)发送到 docker 守护进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# test.txt 是相对路径,相对于构建上下文
COPY test.txt /mkdir/

# 错误写法,文件均不在上下文目录中,并不会被找到
# 这个找的就是构建上下文的上级目录的 test.txt
COPY ../test.txt /mkdir/

# 这个找的是本机根目录下的 test.txt
COPY /test.txt /mkdir/
<src> 是目录
  • 则复制目录的全部内容,包括文件系统元数据
  • 不会复制目录本身,只会复制其内容
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY dir /mydir/
<src> 是任何其他类型的文件
  • 则将其与其元数据一起单独复制
  • <dest> 以斜杠 / 结尾,它将被视为一个目录,并且 <src> 的内容将写入

<dest>/base(<src>)

指定了多个 <src> 资源,或者由于使用了通配符

则 <dest> 必须是一个目录,并且必须以斜杠 / 结尾

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY test1.txt test2.txt /mydir/
<dest> 不以斜杠结尾

它将被视为常规文件,并且 <src> 的内容将写入 <dest>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY test.txt /mytext
<dest> 不存在

路径中所有缺失的目录都会自动创建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY test.txt /dir/test/my/

注意事项

<src> 的内容发生变化,第一个遇到的 COPY 指令将使来自 Dockerfile 的所有后续指令的缓存无效,这包括使 RUN 指令的缓存无效

完整练习的 dockerfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM centos
# 添加文件到目录下
COPY test.txt /mydir/

# 将文件内容写入 mytest
COPY test.txt /mytest

# 压缩文件,自动解压
COPY jmeter.log.zip /myzipdir/

# 添加目录
COPY TeamFile /

# 其他文件
COPY jmeter.log /mydir/

# 多个文件
COPY test1.txt test2.txt /mydir/

# 通配符,dest 不存在自动创建
COPY test*.txt /mydir/test/

# 特殊字符串
COPY COPY[[]0].txt /mydir/

WORKDIR /data

# 相对路径
COPY test.txt test/

ADD 和 COPY 的区别和使用场景

  • ADD 支持添加远程 url 和自动提取压缩格式的文件,COPY 只允许从本机中复制文件
  • COPY 支持从其他构建阶段中复制源文件(--from)
  • 根据官方 Dockerfile 最佳实践,除非真的需要从远程 url 添加文件或自动提取压缩文件才用 ADD,其他情况一律使用 COPY
注意
  • ADD 从远程 url 获取文件和复制的效果并不理想,因为该文件会增加 Docker Image 最终的大小
  • 相反,应该使用 curl huo wget 来获取远程文件,然后在不需要它时进行删除
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Dockerfile(10) - ADD 指令详解
仅适用于 linux 上的 dockerfile,在 window 上没有用户、组的概念
小菠萝测试笔记
2021/11/02
10.2K0
【云原生 | Docker篇】深入Dockerfile(四)
用 VOLUME 声明了卷,那么以后对于卷内容的修改会被丢弃,所以, 一定在volume声明之前修改内容 ;
Lansonli
2022/05/02
1.6K0
【云原生 | Docker篇】深入Dockerfile(四)
Docker学习笔记---Dockerfile
Docker可以通过从Dockerfile包含所有命令的文本文件中读取指令,自动构建镜像。
earthchen
2020/09/24
7500
【愚公系列】2022年01月 Docker容器 Dockerfile详解
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
愚公搬代码
2022/12/01
6660
Dockerfile文件编写官方文档 原
英文原文链接地址: Engine reference–>Dockerfile reference
拓荒者
2019/03/11
1K0
Dockerfile的制作
Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
Al1ex
2023/12/22
2480
Docker 镜像构建保姆级入门实战指南
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
BUG弄潮儿
2023/09/02
4550
Docker 镜像构建保姆级入门实战指南
使用Dockerfile
在前面我们简单提到了如何使用Dockerfile文件来创建镜像,鉴于这种方式在日常工作中使用的较为频繁,因此这里专门拿出一篇文章来研究如何使用Dockerfile配置文件来创建镜像。这里会介绍Dockerfile比较典型的基本结构及其支持的众多指令,然后通过这些指令来编写定制镜像的Dockerfile文件,接着便使用该Dockerfile文件来生成镜像,最后会结合笔者自身工作经验来谈谈一些使用Dockerfile的最佳实践。
啃饼思录
2021/01/12
8690
Dockerfile文件万字全面解析
Dockerfile是一个文本文件,包含一些Docker指令。执行docker build,Docker就会执行Dockerfile里面的指令,来自动创建镜像。
dongfanger
2020/09/23
2.8K0
Dockerfile文件万字全面解析
docker命令实战
docker分层:每一次对原始镜像的修改都会形成新的一层,一层层的叠加,多个不同的容器实例可以共享原始镜像,并在磁盘记录新的修改,即采用写时复制的技术,可以节省磁盘空间
素履coder
2022/08/30
7200
docker命令实战
Docker 构建镜像
Dockerfile由一系列指令和参数组成。每条指令都必须为大写字母,切后面要跟随一个参数。Dockerfile中的指令会按照顺序从上到下执行,所以应该根据需要合理安排指令的顺序。每条指令都会创建一个新的镜像层并对镜像进行提交。Docker大体上按照如下流程执行Dockerfile中的指令。
程序员果果
2019/05/28
1.4K0
Docker重学系列之Dockerfile
Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。
大忽悠爱学习
2022/05/10
2K0
Docker重学系列之Dockerfile
Dockerfile的详解
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
Lansonli
2021/10/09
5220
DockerFile
ADD: 拷贝加解压缩:将宿主机目录下的文件拷贝进镜像且add命令会自动处理rul和解压tar压缩包
PayneWu
2020/12/18
1.2K0
DockerFile
Dockerfile 命令详解
使用 Docker 就会避免不了的要做各种镜像,就会用到 Dockerfile,记录一下 Dockerfile 的主要命令
BUG弄潮儿
2022/04/15
1.1K0
docker—Dockerfile指令详解
dockerfile用来定制镜像,我们知道镜像实际上是一层一层的,镜像的定制实际上就是定制每一层所添加的配置和文件。
dogfei
2020/07/31
8000
Docker 容器镜像制作指令详解
从镜像大小上面来说,一个比较小的镜像只有1MB多点或几MB,而内核文件需要几十MB, 因此镜像里面是没有内核的,镜像在被启动为容器后将直接使用宿主机的内核,而镜像本身则只提供相应的rootfs,即系统正常运行所必须的用户空间的文件系统,比如: /dev/,/proc,/bin,/etc等目录,容器当中/boot目录是空的,而/boot当中保存的就是与内核相关的文件和目录。
BUG弄潮儿
2022/06/07
3.4K0
Docker 容器镜像制作指令详解
docker容器dockerfile详解
Dockerfile是一个镜像构建命令集合的文本文件,下面是我们最常见的Dockerfile构建,假如我们目录下有一个文件Dockerfile
用户8851537
2021/08/20
1.5K0
Docker 镜像构建之 Dockerfile
在 Docker 中构建镜像最常用的方式,就是使用 Dockerfile。Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。官方文档:https://docs.docker.com/engine/reference/builder/
贾维斯Echo
2024/03/21
4.5K0
Docker 镜像构建之 Dockerfile
Dockerfile 指令
1、Dockerfile基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。
小手冰凉
2020/08/06
5120
Dockerfile 指令
相关推荐
Dockerfile(10) - ADD 指令详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验