COPY
一段话总结完 COPY
- 作用:复制内容到镜像
- 格式: COPY
- 详解:复制本地主机的
下内容到镜像中的 ,目标路径不存在时,会自动创建。 :可以是 Dockerfile 所在目录的一个相对路径(文件或目录) :可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对路径 - 路径:支持正则表达式, COPY test* /tmp
两种格式
1 | COPY [--chown=<user>:<group>] <src>... <dest> |
–chown
仅适用于 linux 上的 dockerfile,在 window 上没有用户、组的概念
COPY 作用
- COPY 指令从
复制新文件、目录或远程文件 URL,并将它们添加到路径 - 可以指定多个
资源,但如果它们是文件或目录,则它们的路径被解析为相对于构建上下文的源 - 每个
可能包含通配符,匹配将使用 Go 的 filepath.Match 规则完成
简单栗子
* 通配符
把所有 hom 开头的文件复制到镜像文件系统的 /mydir/ 目录下
1 | COPY hom* /mydir/ |
? 通配符
? 匹配 0 或 1 个字符,比如会把 home.txt 文件复制到 /mydir/ 目录下
1 | COPY hom?.txt /mydir/ |
重点
使用相对路径的栗子
1 | COPY test.txt relativeDir/ |
等价于
1 | COPY test.txt <WORKDIR>/relativeDir/ |
使用绝对路径的栗子
将 test.txt 添加到 /absoluteDir/ 目录下
1 | COPY test.txt /absoluteDir/ |
包含特殊字符的文件
添加名为 arr[0].txt 的文件
1 | COPY arr[[]0].txt /mydir/ |
标志 --from=
将从 from 指定的构建阶段中寻找源文件
1 | # 第一构建阶段:将仅用于生成 requirements.txt 文件 |
COPY 遵循的规则
路径必须在构建的上下文中
不能添加 …/something 、 /something ,因为 docker 构建的第一步是将上下文目录(和子目录)发送到 docker 守护进程
1 | # test.txt 是相对路径,相对于构建上下文 COPY test.txt /mkdir/ # 错误写法,文件均不在上下文目录中,并不会被找到 # 这个找的就是构建上下文的上级目录的 test.txt COPY ../test.txt /mkdir/ # 这个找的是本机根目录下的 test.txt COPY /test.txt /mkdir/ |
是目录
- 则复制目录的全部内容,包括文件系统元数据
- 不会复制目录本身,只会复制其内容
1 | COPY dir /mydir/ |
是任何其他类型的文件
- 则将其与其元数据一起单独复制
以斜杠 / 结尾,它将被视为一个目录,并且 的内容将写入 /base( )
指定了多个资源,或者由于使用了通配符
则
1 | COPY test1.txt test2.txt /mydir/ |
不以斜杠结尾
它将被视为常规文件,并且
1 | COPY test.txt /mytext |
不存在
路径中所有缺失的目录都会自动创建
1 | COPY test.txt /dir/test/my/ |
注意事项
完整练习的 dockerfile
1 | FROM centos |
ADD 和 COPY 的区别和使用场景
- ADD 支持添加远程 url 和自动提取压缩格式的文件,COPY 只允许从本机中复制文件
- COPY 支持从其他构建阶段中复制源文件(–from)
- 根据官方 Dockerfile 最佳实践,除非真的需要从远程 url 添加文件或自动提取压缩文件才用 ADD,其他情况一律使用 COPY
注意
- ADD 从远程 url 获取文件和复制的效果并不理想,因为该文件会增加 Docker Image 最终的大小
- 相反,应该使用 curl huo wget 来获取远程文件,然后在不需要它时进行删除