區(qū)別:COPY指令不支持從遠(yuǎn)程URL獲取資源,只能從執(zhí)行docker build所在的主機(jī)上讀取資源并復(fù)制到鏡像中;而ADD指令支持從遠(yuǎn)程URL獲取資源,可以通過URL從遠(yuǎn)程服務(wù)器讀取資源并復(fù)制到鏡像中。
本教程操作環(huán)境:linux5.9.8系統(tǒng)、docker-1.13.1版、Dell G3電腦。
Dockerfile中的COPY指令和ADD指令都可以將主機(jī)上的資源復(fù)制或加入到容器鏡像中,都是在構(gòu)建鏡像的過程中完成的。
DockerFile的ADD和COPY的區(qū)別
COPY指令和ADD指令的唯一區(qū)別在于:是否支持從遠(yuǎn)程URL獲取資源。
COPY指令只能從執(zhí)行docker build所在的主機(jī)上讀取資源并復(fù)制到鏡像中。而ADD指令還支持通過URL從遠(yuǎn)程服務(wù)器讀取資源并復(fù)制到鏡像中。
相同需求時(shí),推薦使用COPY指令。ADD指令更擅長(zhǎng)讀取本地tar文件并解壓縮。
ADD和COPY指令
COPY同ADD的語法一致,復(fù)制拷貝文件。
ADD
復(fù)制新文件、目錄或遠(yuǎn)程文件 URL <src> ,并將它們添加到<dest>中。
<src>可以指定多個(gè)資源,但如果它們是文件或目錄,則它們的路徑被解釋為相對(duì)于構(gòu)建上下文的源,也就是_WORKDIR_。
每個(gè)都<src>可能包含通配符,匹配將使用 Go 的 filepath.Match規(guī)則。例如:
添加所有以“hom”開頭的文件:
ADD hom* /mydir/
在下面的示例中,?被替換為任何單個(gè)字符,例如“home.txt”。
ADD hom?.txt /mydir/
<dest>是一個(gè)絕對(duì)路徑,或相對(duì)WORKDIR的相對(duì)路徑。
ADD指令有如下的優(yōu)越性:
-
1、如果源路徑是個(gè)文件,且目標(biāo)路徑是以 / 結(jié)尾, 則docker會(huì)把目標(biāo)路徑當(dāng)作一個(gè)目錄,會(huì)把源文件拷貝到該目錄下。
如果目標(biāo)路徑不存在,則會(huì)自動(dòng)創(chuàng)建目標(biāo)路徑。 -
2、如果源路徑是個(gè)文件,且目標(biāo)路徑是不是以 / 結(jié)尾,則docker會(huì)把目標(biāo)路徑當(dāng)作一個(gè)文件。
如果目標(biāo)路徑不存在,會(huì)以目標(biāo)路徑為名創(chuàng)建一個(gè)文件,內(nèi)容同源文件;
如果目標(biāo)文件是個(gè)存在的文件,會(huì)用源文件覆蓋它,當(dāng)然只是內(nèi)容覆蓋,文件名還是目標(biāo)文件名。
如果目標(biāo)文件實(shí)際是個(gè)存在的目錄,則會(huì)源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結(jié)尾,以避免混淆。 -
3、如果源路徑是個(gè)目錄,且目標(biāo)路徑不存在,則docker會(huì)自動(dòng)以目標(biāo)路徑創(chuàng)建一個(gè)目錄,把源路徑目錄下的文件拷貝進(jìn)來。
如果目標(biāo)路徑是個(gè)已經(jīng)存在的目錄,則docker會(huì)把源路徑目錄下的文件拷貝到該目錄下。 -
4、如果源文件是個(gè)歸檔文件(壓縮文件),則docker會(huì)自動(dòng)幫解壓。
上面的優(yōu)勢(shì)也是ADD劣勢(shì)
推薦學(xué)習(xí):《docker視頻教程》