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源文件
- 服務升級
- 筆記
- 鏡像