前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dockerfile(10) - ADD 指令详解

Dockerfile(10) - ADD 指令详解

作者头像
小菠萝测试笔记
发布2021-11-02 16:18:23
9.1K0
发布2021-11-02 16:18:23
举报

一段话总结完 ADD

  • 作用:添加内容到镜像
  • 格式:

ADD <src> <dest>

  • 详解:该命令将复制指定的 <src> 路径下内容到镜像中的 <dest> 路径下
  • <src>:可以是 Dockerfile 所在目录的一个相对路径(文件或目录);也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)
  • <dest>:可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对路径
  • 路径:支持正则表达式,

ADD *.c /code/

两种格式

代码语言:javascript
复制
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
--chown

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

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

简单栗子

* 通配符

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

代码语言:javascript
复制
ADD hom* /mydir/
? 通配符

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

代码语言:javascript
复制
ADD hom?.txt /mydir/

重点

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

使用相对路径的栗子
代码语言:javascript
复制
ADD test.txt relativeDir/

等价于

代码语言:javascript
复制
ADD test.txt <WORKDIR>/relativeDir/
使用绝对路径的栗子

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

代码语言:javascript
复制
ADD test.txt /absoluteDir/

包含特殊字符的文件

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

代码语言:javascript
复制
ADD arr[[]0].txt /mydir/

ADD 遵循的规则

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

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

代码语言:javascript
复制
# test.txt 是相对路径,相对于构建上下文
ADD test.txt /mkdir/

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

# 这个找的是本机根目录下的 test.txt
ADD /test.txt /mkdir/
<src> 是一个 URL
  • <dest> 不以斜杠结尾,那么文件将从 URL 下载并复制到 <dest>
  • <dest> 以斜杠结尾,则从 URL 推断文件名并将文件下载到 <dest>/<filename>
代码语言:javascript
复制
ADD http://example.com/foobar/
  • 这将创建文件 /foobar
  • URL 必须有一个重要的路径,以便在这种情况下可以 找到文件名(http://example.com 将不起作用)
<src> 是目录
  • 则复制目录的全部内容,包括文件系统元数据
  • 不会复制目录本身,只会复制其内容
代码语言:javascript
复制
ADD dir /mydir/
<src> 是压缩格式(gzip、bzip2、identity、xz)的本地 tar 文件
  • 会将它自动解压为目录
  • 但来自远程 URL 资源不会被解压缩
  • 当一个目录被复制或解压时,它的行为与 tar -x 相同
  • 注意:文件是否被识别为可识别的压缩格式完全取决于文件的内容,而不是文件的名称;例如,如果一个空文件恰好以 .tar.gz 结尾,黄不会被识别为压缩文件,也不会生成任何类型的解压缩错误消息,而只会将该文件复制到目标位置
<src> 是任何其他类型的文件
  • 则将其与其元数据一起单独复制
  • <dest> 以斜杠 / 结尾,它将被视为一个目录,并且 <src> 的内容将写入

<dest>/base(<src>)

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

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

代码语言:javascript
复制
ADD test1.txt test2.txt /mydir/
<dest> 不以斜杠结尾

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

代码语言:javascript
复制
ADD test.txt /mytext
<dest> 不存在

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

代码语言:javascript
复制
ADD test.txt /dir/test/my/

注意事项

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

完整练习的 dockerfile

代码语言:javascript
复制
FROM centos
# 添加文件到目录下
ADD test.txt /mydir/

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

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

# 添加目录
ADD TeamFile /

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

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

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

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

WORKDIR /data

# 相对路径
ADD 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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一段话总结完 ADD
  • 两种格式
    • --chown
      • ADD 作用
      • 简单栗子
        • * 通配符
          • ? 通配符
          • 重点
            • 使用相对路径的栗子
              • 使用绝对路径的栗子
              • 包含特殊字符的文件
              • ADD 遵循的规则
                • <src> 路径必须在构建的上下文中
                  • <src> 是一个 URL
                    • <src> 是目录
                      • <src> 是压缩格式(gzip、bzip2、identity、xz)的本地 tar 文件
                        • <src> 是任何其他类型的文件
                          • 指定了多个 <src> 资源,或者由于使用了通配符
                            • <dest> 不以斜杠结尾
                              • <dest> 不存在
                              • 注意事项
                              • 完整练习的 dockerfile
                              • ADD 和 COPY 的区别和使用场景
                                • 注意
                                相关产品与服务
                                容器服务
                                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档