44-Dockerfile-ADD/COPY指令

简介: 44-Dockerfile-ADD/COPY指令

前言

  • 本篇来学习下Dockerfile中的ADD/COPY指令

ADD

作用

  • 可以将上下文指定的内容添加(复制)到镜像中,如果是压缩包,ADD 会自动解压;如果是远程 URL ,ADD 会自动下载;但是,ADD 并没有自动下载远程压缩文件并解压的功能

格式

1. ADD <src>... <dest>
2. ADD ["<src>",... "<dest>"]
  • 说明
  • <src>:可以是 Dockerfile 所在目录的一个相对路径(文件或目录);也可以是一个 URL(如果写成一个url,那么ADD就类似于wget命令);还可以是一个 tar 文件(自动解压为目录)
  • <dest>:可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对路径
  • <src>为一个目录的时候,会自动把目录下的文件复制过去,目录本身不会复制
  • 如果<src>为多个文件, <dest>一定要是一个目录
  • 如果 <src>是 URL ,并且 <dest>不以 / 结尾,那么就会从 URL 下载文件并将其复制为 dest(名称)。
  • 如果 <src>是 URL ,并且 <dest>以 / 结尾,会自动推断出文件的名称(URL 的最后一部分)并保存到 dest(目录)中。
  • 路径:支持正则表达式, ADD   *.py    /case
  • 注意
  • <src> 的内容发生变化,第一个遇到的 ADD 指令将使来自 Dockerfile 的所有后续指令的缓存无效,这包括使 RUN 指令的缓存无效
  • <src>路径必须在构建的上下文,不能使用 …/…/xxx 这种方式,因为 Docker 构建的第一步是将上下文目录(包括子目录)发送给 Docker 的守护进程。

使用示例

  • 通配符
# 把py结尾文件添加到镜像文件系统的/case/目录下
ADD *.py /case
# ? 匹配 0 或 1 个字符,把 requerments.txt 文件添加到 /dest 目录下
ADD requerment?.txt  /dest
  • 路径必须在构建的上下文中
# 正确写法 test.txt 是相对路径,相对于构建上下文
ADD test.txt /dest/
# 错误写法 这个找的就是构建上下文的上级目录的 test.txt
ADD ../test.txt /dest/
# 这个找的是本机根目录下的 test.txt
ADD /test.txt /dest/
  • 不存在,路径中所有缺失的目录都会自动创建
ADD /test.txt /dest/case/test

COPY

作用

  • 复制内容到镜像

格式

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
  • 说明
  • –chown:仅在用于构建 Linux 容器的 Dockerfile 上受支持,而在 Windows 容器上不起作用

使用示例

  • 标志 --from=
# 第一构建阶段:将仅用于生成 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

ADD和COPY的区别

  • ADD 支持添加远程 url 和自动提取压缩格式的文件,COPY 只允许从本机中复制文件
  • COPY 支持从其他构建阶段中复制源文件(–from)
  • 根据官方 Dockerfile 最佳实践,除非真的需要从远程 url 添加文件或自动提取压缩文件才用 ADD,其他情况一律使用 COPY

相关文章
|
缓存 Linux Go
Dockerfile(11) - COPY 指令详解
Dockerfile(11) - COPY 指令详解
2724 0
|
开发者 Docker 容器
DockerFile的ADD和COPY的区别
DockerFile的ADD和COPY的区别
3651 0
|
Shell 开发工具 git
43-Dockerfile-FROM/LABEL/RUN指令
43-Dockerfile-FROM/LABEL/RUN指令
|
Docker 容器
Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
本文是博主学习docker 制作镜像指令的记录,希望对大家有所帮助
181 0
Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
|
缓存 Linux Go
Dockerfile(10) - ADD 指令详解
Dockerfile(10) - ADD 指令详解
2101 0
|
缓存 Go Docker
Docker - COPY & ADD
Docker - COPY & ADD
260 0
Docker - COPY & ADD
|
Shell Docker Windows
Dockerfile(8) - USER 指令详解
Dockerfile(8) - USER 指令详解
815 0
|
Shell 容器
DOCKER04_详解Dockerfile基本指令、FROM、LABEL、RUN、CMD、ENTRYPOINT、ARG、ENV、VOLUME、USER(三)
③. RUN 构建时期运行的指令 ④. CMD(运行时期)、ENTRYPOINT 指定启动容器、镜像的默认入口
180 0
DOCKER04_详解Dockerfile基本指令、FROM、LABEL、RUN、CMD、ENTRYPOINT、ARG、ENV、VOLUME、USER(三)