前言
- 本篇来学习下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