一次Dockerfile優(yōu)化

Dockerfile優(yōu)化

本文的起因是在做的一個(gè)項(xiàng)目打包時(shí)間實(shí)在太慢了扎拣,所謂代碼5分鐘,打包半小時(shí)瓶盛,又正好在看docker的一些東西惯疙,所以打算優(yōu)化一下這個(gè)dockerfile

文前

一.首先來看下這個(gè)dockerfile


dockerfile.png
  • 首先將一個(gè)image1鏡像(這里隨意寫的查牌,舉例而已)作為compile鏡像
  • 指定了/code目錄
  • 拷貝了本地的package.json,yarn.lock,npmrc文件到/code目錄中,用于安裝NPM模塊
  • 運(yùn)行了yarn install --production滥壕,并且將node_module拷貝到臨時(shí)目錄
  • 再運(yùn)行yarn
  • 在拷貝所有文件到/code目錄中
  • 運(yùn)行npm run build來打包項(xiàng)目
  • 到這里先提出兩個(gè)問題
    • 問題1:為什么要運(yùn)行了yarn install --production以后再運(yùn)行yarn僧免,這不是重復(fù)了,多此一舉嗎
    • 問題2:為什么要拷貝了package.json/code目錄下捏浊,然后再拷貝一遍全部文件呢懂衩,這不是也重復(fù)了嗎
  • 然后將image2鏡像作為release鏡像
  • 將本地的文件拷貝到當(dāng)前鏡像中
  • 指定/code目錄
  • 從上一層鏡像臨時(shí)目錄中中拷貝node_module
  • 從上一層鏡像中client,config文件夾
  • 運(yùn)行yarn start
  • 解決問題
    • 問題1:當(dāng)時(shí)沒想通,后來突然想通了金踪,運(yùn)行了yarn install --production是安裝了生產(chǎn)要用的NPM包浊洞,然后拷貝到臨時(shí)目錄里,后面從臨時(shí)目錄里拷貝胡岔,拷貝出來的是生產(chǎn)時(shí)要用的包法希,不是全部的包,減少了包的體積
    • 問題2:為什么要先拷貝package.json靶瘸,是因?yàn)槲覀儜?yīng)該把變化最少的部分放在Dockerfile的前面苫亦,這樣可以充分利用鏡像緩存,詳見https://zhuanlan.zhihu.com/p/26904830中的 11.合理調(diào)整COPY與RUN的順序

二.這個(gè)dockerfile打包出來的鏡像的大小,可以看到有725M怨咪,中間鏡像有2.11G屋剑,真的對得起代碼5分鐘,打包半小時(shí)

size.png

三.dive工具分析這個(gè)鏡像诗眨,(dive 鏡像id)唉匾,詳見https://github.com/wagoodman/dive, 可以看到總共725M匠楚,可以優(yōu)化的有421M

dive.png

四.優(yōu)化后的dockerfile

dockerfile.png
  • 我為什么這么優(yōu)化

  • 我沒有先拷貝package.json等文件并安裝了NPM包以后再拷貝其他文件巍膘,因?yàn)楸酒恼轮械?https://zhuanlan.zhihu.com/p/26904830 的合理調(diào)整COPY與RUN的順序中寫到的是首先將package.json拷貝進(jìn)來,然后安裝包芋簿,再將剩余其他文件拷貝進(jìn)指定的目錄峡懈,而我這個(gè)項(xiàng)目,package.json以外的文件都要用到与斤,第一次拷貝package.json等文件以后肪康,第二次拷貝最方便的方法是COPY . /code,要拷貝其他文件幽告,而排除package.json文件的做法反而繁瑣

  • 基于上面那一點(diǎn)的操作的考慮以后梅鹦,在compile鏡像中

    • 指定/code目錄,
    • 將本地文件拷貝到/code目錄下冗锁,
    • yarn build代替npm run build齐唆,然后將yarnyarn build命令合并
  • release鏡像中

    • 去掉code . /code,因?yàn)楹秃竺娴?code>copy --from=compile那些命令重復(fù)了
    • 去掉code . /code以后冻河,鏡像是跑不起來的箍邮,因?yàn)樯倭艘恍┪募?code>package.json和next.config.js茉帅,運(yùn)行yarn start的時(shí)候要package.json文件,而yarn start命令是NEXT_ENV=prod PORT=3000 next start client锭弊,要next的配置文件
  • 我是怎么知道少了這些文件的

    • docker run --name test -p 4040:3000 5be399174a72首先先跑起這個(gè)鏡像
    • docker ps -a 找出容器
    • docker exec -it c57cb2999203 /bin/sh進(jìn)入到容器中查看堪澎,可以看到/code目錄中有這些文件,對比起先可以跑起來的容器里面的文件和跑不起來的容器的報(bào)錯(cuò)味滞,排查出少了哪些文件樱蛤,需要哪些文件
  • 根據(jù)問題1的解答,我為什么不用yarn install --production了剑鞍,因?yàn)橹挥眠@些包昨凡,yarn start命令是跑不起來的,而且從下面的dive工具顯示蚁署,可以優(yōu)化的已經(jīng)只有358K了便脊,也就沒有必要運(yùn)行這個(gè)命令再拷貝到臨時(shí)目錄了,畢竟后面也還要運(yùn)行yarn

    exec.png

五.可以看到現(xiàn)在鏡像只有489M的光戈,中間鏡像compile也變少了哪痰,只有1.71G

size.png

六.再用dive工具查看這個(gè)鏡像,發(fā)現(xiàn)總共489M久妆,可以優(yōu)化的只有358K了

dive.png

七. 優(yōu)化升級.dockerignore

  • 因?yàn)槲覀儠脃arn重新晌杰,所以沒有必要將本地的node_module包傳到docker服務(wù)器上
  • 可以看到,設(shè)置.dockerignore以后镇饺,傳到docker服務(wù)器上的大小從343M減到了29M
upload.png
upload.png

八.為什么這個(gè)dockerfile跑不起來

  • 因?yàn)楦鶕?jù)dive工具分析出了是node_module乎莉,所以這個(gè)dockerfile在最初的dockerfile上加了一句RUN /bin/rm -fr node_modules
  • 前面說到了,yarn start的時(shí)候要用到node_module奸笤,所以在前面刪了node_module會跑不起來
why.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哼鬓,隨后出現(xiàn)的幾起案子监右,更是在濱河造成了極大的恐慌,老刑警劉巖异希,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件健盒,死亡現(xiàn)場離奇詭異,居然都是意外死亡称簿,警方通過查閱死者的電腦和手機(jī)扣癣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憨降,“玉大人父虑,你說我怎么就攤上這事∈谝” “怎么了士嚎?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵呜魄,是天一觀的道長。 經(jīng)常有香客問我莱衩,道長爵嗅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任笨蚁,我火速辦了婚禮睹晒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘括细。我一直安慰自己伪很,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布勒极。 她就那樣靜靜地躺著是掰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辱匿。 梳的紋絲不亂的頭發(fā)上键痛,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音匾七,去河邊找鬼絮短。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昨忆,可吹牛的內(nèi)容都是我干的丁频。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼邑贴,長吁一口氣:“原來是場噩夢啊……” “哼席里!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拢驾,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奖磁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后繁疤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咖为,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年稠腊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躁染。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡架忌,死狀恐怖吞彤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鳖昌,我是刑警寧澤备畦,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布低飒,位于F島的核電站,受9級特大地震影響懂盐,放射性物質(zhì)發(fā)生泄漏褥赊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一莉恼、第九天 我趴在偏房一處隱蔽的房頂上張望拌喉。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽田藐。三九已至,卻和暖如春吱七,著一層夾襖步出監(jiān)牢的瞬間汽久,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工踊餐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留景醇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓吝岭,卻偏偏與公主長得像三痰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子窜管,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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

  • 鏡像的定制實(shí)際上就是定制鏡像的每一層所添加的配置散劫、文件等信息,實(shí)際上當(dāng)我們在一個(gè)容器中添加或者修改了一些文件后幕帆,我...
    wangfs閱讀 327評論 0 0
  • 前端工程化代碼一般通過 包(package) (或者稱為 模塊(module)) 的方式來共享舷丹,因此你可以通過它...
    January丶緣閱讀 1,162評論 0 0
  • 寫在最前 1356的錯(cuò)誤,在前幾天寫的mysqldump問題集合里面已經(jīng)寫過了蜓肆,然而本次按照常規(guī)的套路無法處理這次...
    飛翔的Tallgeese閱讀 2,575評論 0 0
  • 關(guān)燈睡覺的人兒,突然想到還沒完成今天的簡書谋币。 今天杭州下雪仗扬,因?yàn)檫B續(xù)的下雨,所以沒有積起來蕾额,中間貌似還夾雜過一些小...
    雨文_yuwencc1009閱讀 130評論 0 0
  • 女兒對我的工作充滿好奇早芭,可能是我經(jīng)常帶著女兒工作的原因,她對我的工作環(huán)境诅蝶、工作內(nèi)容退个、工作流程募壕、工作節(jié)奏非常熟悉,培...
    宋阿娜閱讀 104評論 0 6