add于copy都可以用来:
1. 从dockerfile中构建 docker image时,将本地文件添加到镜像当中去,比如编译安装nginx的tar包,nginx的配置文件等,使得配置和安装更加的灵活。
2. 格式如下
```
ADD <src> <dest>
COPY <src> <dest>
```
## 1. add
### 1.1 可以下载文件
```
ADD http://foo.com/bar.go /tmp/main.go
```
以上文件会通过制定的URL下载下来,并且添加到容器的文件系统中的/tmp/main.go路径中。另外一种形式是让你简单地制定目的目录为下载文件:
```
ADD http://foo.com/bar.go /tmp/
```
因为以 / 结尾 **Docker 会从URL推断文件名,并且添加到指定目录。** 在这个案例中,一个名叫/tmp/bar.go的文件会被添加到容器的文件系统。
### 1.2 add 自动解压
*ADD的另外一个特性是有能力自动解压文件。* 如果参数是一个可识别的压缩格式(tar, gzip, bzip2, etc)的本地文件(所以实现不了同时下载并解压),就会被解压到指定容器文件系统的路径。
> ADD /foo.tar.gz /tmp/
上述指令会使foo.tar.gz压缩文件解压到容器的/tmp目录。
**URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。**
## 2. copy
1. 在Docker 1.0发布时候,包括了新指令COPY。不像是ADD,**COPY 更加直接了当,只复制文件或者目录到容器里**。建议用copy,简单直接。
2. **COPY不支持URL,也不会特别对待压缩文件**。如果build 上下文件中没有指定解压的话,那么就不会自动解压,只会复制压缩文件到容器中。
COPY是ADD的一种简化版本,目的在于满足大多数人“复制文件到容器”的需求。使用哪个?
假如目前还不明显的话,那Docker 团队的建议是在大多数情况下使用COPY。
真的,使用ADD的唯一原因就是你有一个压缩文件,你想自动解压到镜像中。
OK,但是如果想要从远程URLS 中获取包的话,ADD还是没用么?技术上来说,是的。但是在大多数情况下,你更有可能运行curl或者wget。看看下面的例子吧:
```
ADD http://foo.com/package.tar.bz2 /tmp/
RUN tar -xjf /tmp/package.tar.bz2 \\
&& make -C /tmp/package \\
&& rm /tmp/package.tar.bz2
```
这里我们有一个ADD指令,用于解析URL的压缩包,紧接着是RUN指令,用于解压这个压缩包。然后编译并尝试删除下载的压缩包。 很不幸,当这个压缩包压缩后,rm命令处于独立的镜像层。。
在这个案例中,你组好这样做:
```
RUN curl http://foo.com/package.tar.bz2 \\
| tar -xjC /tmp/package \\
&& make -C /tmp/package
```
这里,我们curl 这个压缩包并且通过管道传给tar 命令解压。这样就在同一层镜像那么我们就可以删除压缩包了。
始终还是会有理由使用ADD 一个远程文件到你的镜像中,但是这个一个明确的决定,而不是默认的选择。
最后,只要认准一个原则:使用COPY(除非你明确你需要ADD)
- docker
- docker安装
- 数据持久化
- 镜像管理
- Dockerfile
- 镜像的分层
- add copy
- 构建实例
- 镜像的导入导出
- 清理构建空间
- 配置阿里云加速器
- docker网络模型
- 本地仓库
- registry
- harbor
- IDEA部署docker
- 软件安装
- 安装es
- 安装MongoDB
- 安装rabbitmq
- 安装redis
- 安装nacos
- 安装mysql
- Minio
- 镜像中心
- kubernetes
- 1. 安装k8s
- 2.主要组件
- 3.污点
- 4.pod
- 5.控制器
- 6.网络
- 7.探针
- 8.安装Dashbord
- 9.secret
- 9.serviceAccount
- 10.service
- 资源清单
- kube-proxy
- flannel源文件
- 服务升级
- 笔记
- 镜像