docker Dockerfile指令ADD和COPY的區別,添加目錄方法
ADD指令的功能是將主機構建環境(上下文)目錄中的文件和目錄、以及一個URL標記的文件 拷貝到鏡像中。
其格式是: ADD 源路徑 目標路徑
#把當前config目錄下所有文件拷貝到/config/目錄下
ADD config/ /config/
ADD test1.txt test1.txt
ADD test1.txt test1.txt.bak
ADD test1.txt /mydir/
ADD data1 data1
ADD data2 data2
ADD zip.tar /myzip
有如下注意事項:
1、如果源路徑是個文件,且目標路徑是以 / 結尾, 則docker會把目標路徑當作一個目錄,會把源文件拷貝到該目錄下。
如果目標路徑不存在,則會自動創建目標路徑。
2、如果源路徑是個文件,且目標路徑是不是以 / 結尾,則docker會把目標路徑當作一個文件。
如果目標路徑不存在,會以目標路徑為名創建一個文件,內容同源文件;
如果目標文件是個存在的文件,會用源文件覆蓋它,當然只是內容覆蓋,文件名還是目標文件名。
如果目標文件實際是個存在的目錄,則會源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結尾,以避免混淆。
3、如果源路徑是個目錄,且目標路徑不存在,則docker會自動以目標路徑創建一個目錄,把源路徑目錄下的文件拷貝進來。
如果目標路徑是個已經存在的目錄,則docker會把源路徑目錄下的文件拷貝到該目錄下。
4、如果源文件是個歸檔文件(壓縮文件),則docker會自動幫解壓。
----------------
ADD從一開始就是Docker 的一部分,並且支持一些傳統的技巧,而不僅僅是從build 上下文中復制文件。
ADD指令可以讓你使用URL作為<src>參數。當遇到URL時候,可以通過URL下載文件並且復制到<dest>。
ADD http://foo.com/bar.go /tmp/main.go
以上文件會通過制定的URL下載下來,並且添加到容器的文件系統中的/tmp/main.go路徑中。另外一種形式是讓你簡單地制定目的目錄為下載文件:
ADD http://foo.com/bar.go /tmp/
因為<dest>以 / 結尾。Docker 會從URL推斷文件名,並且添加到指定目錄。在這個案例中,一個名叫/tmp/bar.go的文件會被添加到容器的文件系統。
ADD的另外一個特性是有能力自動解壓文件。如果<src>參數是一個可識別的壓縮格式(tar, gzip, bzip2, etc)的本地文件(所以實現不了同時下載並解壓),就會被解壓到指定容器文件系統的路徑<dest>。
ADD /foo.tar.gz /tmp/
上述指令會使foo.tar.gz壓縮文件解壓到容器的/tmp目錄。
URL下載和解壓特性不能一起使用。任何壓縮文件通過URL拷貝,都不會自動解壓。
目前ADD指令有點讓人迷惑,有時候解壓文件,有時候不解壓文件,如果你想拷貝一個壓縮文件,你會以為地解壓。如果文件是某種不能識別的壓縮文件,如果你想解壓,你又會意外地復制它。
這種解釋似乎是ADD嘗試做的太多了,讓用戶有些疑惑。很明顯,沒人想要打破向后兼容性。所以決定新增一個行為更加明確的指令。
COPY和ADD相似,但是功能少一些。
在Docker 1.0發布時候,包括了新指令COPY。不像是ADD,COPY 更加直接了當,只復制文件或者目錄到容器里。
COPY不支持URL,也不會特別對待壓縮文件。如果build 上下文件中沒有指定解壓的話,那么就不會自動解壓,只會復制壓縮文件到容器中。
COPY是ADD的一種簡化版本,目的在於滿足大多數人“復制文件到容器”的需求。
Docker 團隊的建議是在大多數情況下使用COPY。拷貝文件的原則:使用COPY(除非你明確你需要ADD)
golang技術交流群:316397059,vuejs技術交流群:458915921 滲透技術:534096581,有興趣的可以加入
微信公眾號:大自然預測(ssqyuce)原雙色球預測, 心禪道(xinchandao),囤幣一族(tunbitt)