【現(xiàn)學(xué)現(xiàn)忘Docker基礎(chǔ)】— 32.COPY和ADD指令

COPYADD 都是 Dockerfile 中的指令禀晓,有著類似的作用矮嫉。它們?cè)试S我們將文件從特定位置復(fù)制到 Docker 鏡像中臊诊。

1坡慌、COPY指令

(1)COPY指令說(shuō)明

COPY 指令從 <src> 復(fù)制新的文件或目錄芽世,并將它們添加到 Docker 容器文件系統(tǒng)的 <dest> 的路徑下挚赊。

(2)COPY指令格式

COPY 有兩種格式:(和 RUN 指令一樣)

  • COPY [--chown=<user>:<group>] <src>... <dest>
  • COPY [--chown=<user>:<group>] ["<src>",... "<dest>"](包含空格的路徑使用這種格式)

翻譯一下:

  • COPY [--chown=<user>:<group>] <源路徑>... <目標(biāo)路徑>
  • COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標(biāo)路徑>"]

(3)COPY指令使用

COPY 指令將從構(gòu)建上下文目錄中 <源路徑> 的文件或目錄,復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置济瓢。

比如:

COPY package.json /usr/src/app/
  1. <源路徑> :可以是多個(gè)荠割,甚至可以是通配符,其通配符規(guī)則要滿足 Go 的filepath.Match規(guī)則旺矾,

    如下:

    COPY hom* /mydir/
    COPY hom?.txt /mydir/
    
  2. <目標(biāo)路徑> :可以是容器內(nèi)的絕對(duì)路徑蔑鹦,也可以是相對(duì)于工作目錄的相對(duì)路徑(工作目錄可以用 WORKDIR 指令來(lái)指定)。

    目標(biāo)路徑不需要事先創(chuàng)建箕宙,如果目錄不存在嚎朽,會(huì)在復(fù)制文件前先行創(chuàng)建缺失目錄。

此外柬帕,還需要注意一點(diǎn)哟忍,使用 COPY 指令,源文件的各種元數(shù)據(jù)都會(huì)保留陷寝。比如讀锅很、寫(xiě)、執(zhí)行權(quán)限凤跑、文件變更時(shí)間等爆安。這個(gè)特性對(duì)于鏡像定制很有用,特別是構(gòu)建相關(guān)文件都在使用 Git 進(jìn)行管理的時(shí)候仔引。

(4)其他

在使用該指令的時(shí)候還可以加上 --chown=<user>:<group> 選項(xiàng)鹏控,來(lái)改變文件的所屬用戶及所屬組。

COPY --chown=55:mygroup files* /mydir/
COPY --chown=bin files* /mydir/
COPY --chown=1 files* /mydir/
COPY --chown=10:11 files* /mydir/

2肤寝、ADD指令

ADD 指令和 COPY 指令的格式和性質(zhì)基本一致当辐,但是在 COPY 基礎(chǔ)上增加了一些功能。

(1)ADD指令說(shuō)明

ADD指令有一些額外的功能 :

  • ADD指令可以讓你使用 URL 作為 <src> 參數(shù)鲤看。當(dāng)遇到 URL 時(shí)候缘揪,可以通過(guò) URL 下載文件并且復(fù)制到 <dest>(容器中目標(biāo)路徑)。
  • ADD的另一個(gè)特性是自動(dòng)解壓文件的能力。如果 <src> 參數(shù)是一個(gè)可識(shí)別壓縮格式(tar, gzip, bzip2, …)的本地文件注:無(wú)法實(shí)現(xiàn)同時(shí)下載并解壓)找筝,就會(huì)被解壓到指定容器文件系統(tǒng)的路徑 <dest> 下蹈垢。

即:ADD指令是將本地文件復(fù)制到容器中,也支持通過(guò) URL 進(jìn)行復(fù)制袖裕,但效率通常很低(不推薦使用)曹抬。

(2)ADD指令格式

ADD 有兩種格式:

  • ADD [--chown=<user>:<group>] <src>... <dest>
  • ADD [--chown=<user>:<group>] ["<src>",... "<dest>"](包含空格的路徑使用這種格式)

(3)ADD指令使用

ADD 的最佳用途是將本地壓縮包文件自動(dòng)提取到鏡像中:

如下情況,自動(dòng)解壓縮的功能非常有用急鳄,比如官方鏡像 ubuntu 中:

FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
...

提示:但在某些情況下谤民,如果我們真的是希望復(fù)制個(gè)壓縮文件進(jìn)去,而不解壓縮疾宏,這時(shí)就不可以使用 ADD 命令了张足。

(4)不推薦使用ADD指令下載文件的原因

由于鏡像的體積很重要,所以強(qiáng)烈建議不要使用 ADD 從遠(yuǎn)程 URL 獲取文件坎藐,下載文件我們應(yīng)該使用 curlwget 來(lái)代替为牍。

因?yàn)槿绻螺d的是個(gè)壓縮包,需要解壓縮岩馍,還需要額外的一層 RUN 指令進(jìn)行解壓縮碉咆。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下載蛀恩,處理權(quán)限吟逝、解壓縮、然后清理無(wú)用文件更合理赦肋。

因此,這個(gè)功能其實(shí)并不實(shí)用励稳,而且不推薦使用佃乘。

示例:

我們應(yīng)該避免以下操作:(Dockerfile文件)

ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things \  # 解壓  
    && make -C /usr/src/things all \    # 編譯
    && rm -f /usr/src/things/big.tar.xz # 刪除

這個(gè)壓縮包解壓后,rm 命令處于獨(dú)立的鏡像層驹尼。

我們可以這樣做:

RUN mkdir -p /usr/src/things \    
    && curl -SL http://example.com/big.tar.xz \    
        | tar -xJC /usr/src/things \    
    && make -C /usr/src/things all

curl 會(huì)下載這個(gè)壓縮包并通過(guò)管道傳給 tar 命令進(jìn)行解壓趣避,這樣也就不會(huì)在文件系統(tǒng)中留下這個(gè)壓縮文件了。

對(duì)于不需要自動(dòng)解壓的文件或目錄新翎,應(yīng)該始終使用 COPY程帕。

最后,認(rèn)準(zhǔn)一個(gè)原則:總是使用 COPY(除非我們明確需要 ADD)地啰。

(5)其他

在使用該指令的時(shí)候還可以加上 --chown=<user>:<group> 選項(xiàng)來(lái)改變文件的所屬用戶及所屬組愁拭。

ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/

3、總結(jié):

在 Docker 官方的 Dockerfile 最佳實(shí)踐文檔中要求亏吝,盡可能的使用 COPY岭埠,因?yàn)?COPY 的語(yǔ)義很明確,就是復(fù)制文件而已,而 ADD則包含了更復(fù)雜的功能惜论,其行為也不一定很清晰许赃。最適合使用 ADD 的場(chǎng)合,就是所提及的需要自動(dòng)解壓縮的場(chǎng)景馆类。

另外需要注意的是混聊,ADD 指令會(huì)令鏡像構(gòu)建緩存失效,從而可能會(huì)令鏡像構(gòu)建變得比較緩慢乾巧。

因此在 COPYADD 指令中選擇的時(shí)候句喜,可以遵循這樣的原則,所有的文件復(fù)制均使用 COPY 指令卧抗,僅在需要自動(dòng)解壓縮的場(chǎng)景使用 ADD指令藤滥。

參考:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市社裆,隨后出現(xiàn)的幾起案子拙绊,更是在濱河造成了極大的恐慌,老刑警劉巖泳秀,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件标沪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嗜傅,警方通過(guò)查閱死者的電腦和手機(jī)金句,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吕嘀,“玉大人违寞,你說(shuō)我怎么就攤上這事∨挤浚” “怎么了趁曼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棕洋。 經(jīng)常有香客問(wèn)我挡闰,道長(zhǎng),這世上最難降的妖魔是什么掰盘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任摄悯,我火速辦了婚禮,結(jié)果婚禮上愧捕,老公的妹妹穿的比我還像新娘奢驯。我一直安慰自己,他們只是感情好次绘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布叨橱。 她就那樣靜靜地躺著典蜕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罗洗。 梳的紋絲不亂的頭發(fā)上愉舔,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音伙菜,去河邊找鬼轩缤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贩绕,可吹牛的內(nèi)容都是我干的火的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淑倾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼馏鹤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起娇哆,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤湃累,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后碍讨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體治力,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年勃黍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宵统。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡覆获,死狀恐怖马澈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弄息,我是刑警寧澤痊班,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站疑枯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛔六。R本人自食惡果不足惜荆永,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望国章。 院中可真熱鬧具钥,春花似錦、人聲如沸液兽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宁玫,卻和暖如春粗恢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欧瘪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工眷射, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佛掖。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓妖碉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親芥被。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欧宜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容