您的位置:首页 > 运维架构 > Docker

docker copy 和add的比较

2017-12-11 20:38 232 查看
相比之下,ADD不会多加一层,会使得镜像的体积少一个JAR那么多,便于传输,特别是 那种网络环境不好的时候,更小的传输量可以说是很大的性能提升
http://blog.csdn.net/small_to_large/article/details/77435468


COPY 复制文件

格式:
COPY <源路径>...
<目标路径>

COPY ["<源路径1>",...
"<目标路径>"]


COPY
 指令将从构建上下文目录中 
<源路径>
 的文件/目录复制到新的一层的镜像内的 
<目标路径>
 位置。比如:
COPY package.json /usr/src/app/


<源路径>
 可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 
filepath.Match
 规则,如:
COPY hom* /mydir/
COPY hom?.txt /mydir/


<目标路径>
 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 
WORKDIR
 指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。

此外,还需要注意一点,使用 
COPY
 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用
Git 进行管理的时候。


ADD 更高级的复制文件

ADD
 指令和 
COPY
 的格式和性质基本一致。但是在 
COPY
 基础上增加了一些功能。

比如 
<源路径>
 可以是一个 
URL
,这种情况下,Docker
引擎会试图去下载这个链接的文件放到 
<目标路径>
 去。下载后的文件权限自动设置为 
600
,如果这并不是想要的权限,那么还需要增加额外的一层 
RUN
进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层 
RUN
 指令进行解压缩。所以不如直接使用 
RUN
 指令,然后使用 
wget
 或者 
curl
 工具下载,处理权限、解压缩、然后清理无用文件更合理。因此,这个功能其实并不实用,而且不推荐使用。

如果 
<源路径>
 为一个 
tar
 压缩文件的话,压缩格式为 
gzip
bzip2
 以及 
xz
 的情况下,
ADD
 指令将会自动解压缩这个压缩文件到 
<目标路径>
 去。

在某些情况下,这个自动解压缩的功能非常有用,比如官方镜像 
ubuntu
 中:
FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
...


但在某些情况下,如果我们真的是希望复制个压缩文件进去,而不解压缩,这时就不可以使用 
ADD
 命令了。

在 Docker 官方的最佳实践文档中要求,尽可能的使用 
COPY
,因为 
COPY
 的语义很明确,就是复制文件而已,而 
ADD
 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 
ADD
 的场合,就是所提及的需要自动解压缩的场合。

另外需要注意的是,
ADD
 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。

因此在 
COPY
 和 
ADD
 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 
COPY
 指令,仅在需要自动解压缩的场合使用 
ADD


参考地址(https://yeasy.gitbooks.io/docker_practice)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息