Dockerfile(11) - COPY 指令详解

简介: Dockerfile(11) - COPY 指令详解

一段话总结完 COPY


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

 

两种格式


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/ 目录下

COPY hom* /mydir/

 

? 通配符

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

COPY hom?.txt /mydir/

 

重点


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

 

使用相对路径的栗子

COPY test.txt relativeDir/

等价于

COPY test.txt <WORKDIR>/relativeDir/

 

使用绝对路径的栗子

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

COPY test.txt /absoluteDir/

 

包含特殊字符的文件


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

COPY arr[[]0].txt /mydir/

 

标志 --from=<name>


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

# 第一构建阶段:将仅用于生成 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 守护进程

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


<src> 是目录

  • 则复制目录的全部内容,包括文件系统元数据
  • 不会复制目录本身,只会复制其内容

COPY dir /mydir/

 

<src> 是任何其他类型的文件

  • 则将其与其元数据一起单独复制
  • <dest> 以斜杠 / 结尾,它将被视为一个目录,并且 <src> 的内容将写入  <dest>/base(<src>)

 

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

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

COPY test1.txt test2.txt /mydir/

 

<dest> 不以斜杠结尾

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

COPY test.txt /mytext

 

<dest> 不存在

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

COPY test.txt /dir/test/my/

 

注意事项


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

 

完整练习的 dockerfile


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 来获取远程文件,然后在不需要它时进行删除
相关文章
|
Docker 容器
Docker学习笔记三:如何运行一个容器?
Docker学习笔记三:如何运行一个容器?
944 0
Docker学习笔记三:如何运行一个容器?
|
存储 缓存 芯片
让星星⭐月亮告诉你,当我们在说CPU一级缓存二级缓存三级缓存的时候,我们到底在说什么?
本文介绍了CPU缓存的基本概念和作用,以及不同级别的缓存(L1、L2、L3)的特点和工作原理。CPU缓存是CPU内部的存储器,用于存储RAM中的数据和指令副本,以提高数据访问速度,减少CPU与RAM之间的速度差异。L1缓存位于处理器内部,速度最快;L2缓存容量更大,但速度稍慢;L3缓存容量最大,由所有CPU内核共享。文章还对比了DRAM和SRAM两种内存类型,解释了它们在计算机系统中的应用。
2798 1
|
6月前
|
人工智能 自然语言处理 JavaScript
OpenClaw 汉化中文版(包含新安装包)|Windows 一键安装,全程不用输任何命令
超省心的 OpenClaw 汉化一键安装包,Windows 系统直接双击安装,无需配置环境、不用敲代码命令,自动完成汉化与部署,小白也能轻松搞定。
|
JSON Shell Linux
docker-registry 私有仓库镜像 之 查看与删除
docker-registry 私有仓库镜像 之 查看与删除
4176 0
|
JSON Shell 数据格式
初识dockerFile之RUN和WORKDIR
通过本文的介绍,我们详细讲解了Dockerfile中的RUN和WORKDIR指令。RUN指令用于执行命令,生成新的镜像层;WORKDIR指令用于设置工作目录,简化路径管理。合理使用这两个指令,可以提高Dockerfile的可读性和效率。
965 109
|
6月前
|
Ubuntu Linux 开发者
Ubuntu 20.04 安装企业微信教程(小白必备:Linux 环境下企业微信安装全攻略)
本文参考http://qamqb.cn详解Ubuntu 20.04下通过Wine环境(推荐wine64或deepin-wine)安装企业微信的完整流程,涵盖系统更新、环境配置、deb包安装及中文字体修复,助你高效实现Linux办公。
|
数据采集 缓存 监控
唯品会 API 开发痛点解析:从权限申请到数据清洗的实战经验
本文深入解析唯品会开放平台(VOP)API开发全流程,涵盖权限申请、签名机制、数据清洗、性能优化等核心挑战与实战解决方案,助力开发者高效构建稳定可靠的电商数据整合系统。
|
开发框架 Java 编译器
2025年1月推荐-工欲善其事,必先利其器-程序员必备之-核心基本工具—不要看什么国际排行榜-没有用-编辑器和编译器推荐-优雅草央千澈
2025年1月推荐-工欲善其事,必先利其器-程序员必备之-核心基本工具—不要看什么国际排行榜-没有用-编辑器和编译器推荐-优雅草央千澈
954 1
|
Web App开发 网络协议 Linux
如何屏蔽 iOS 26 软件自动更新,去除更新通知和标记
如何屏蔽 iOS 26 软件自动更新,去除更新通知和标记
26136 3
|
安全 Java API
Java日期时间API:从Date到Java.time
本文深入解析了Java 8中引入的全新日期时间API,涵盖LocalDate、LocalTime、LocalDateTime、ZonedDateTime等核心类的使用,以及时间调整、格式化、时区处理和与旧API的互操作。通过实例对比,展示了新API在可变性、线程安全与易用性方面的显著优势,并提供迁移方案与实战技巧,助你掌握现代Java时间处理的最佳实践。