超碰在线91,国产第1页,国产精品99,最近中文字幕av

<video id="z2k50"><ins id="z2k50"></ins></video><small id="z2k50"><pre id="z2k50"><samp id="z2k50"></samp></pre></small>

    1. <video id="z2k50"><ins id="z2k50"></ins></video>

        使用Docker多階段構(gòu)建來(lái)減小鏡像大小

        發(fā)布時(shí)間:2024-05-29
        本文講述了如何通過(guò) docker 的多階段構(gòu)建功能來(lái)大幅度減小鏡像大小,適用于需要在 dockerfile 中構(gòu)建程式(如 javac),且需要另外安裝編譯工具鏈的鏡像。(如 java)
        先來(lái)學(xué)習(xí)單詞(本文全部采用中文詞匯,如需查詢外文文檔可對(duì)照該詞匯表。理論上個(gè)人不贊成翻譯術(shù)語(yǔ)):
        multi-stage 多階段build 構(gòu)建image 鏡像stage 階段再來(lái)看一下效果: 原 110m+,現(xiàn) 92m。
        對(duì)比一下 dockerfile
        優(yōu)化前 dockerfile:
        from openjdk:8u171-jdk-alpine3.8 add . /app workdir /app run apk add maven \ && mvn clean package \ && apk del maven \ && mv target/final.jar / \ && cd / \ && rm -rf /app \ && rm -rf /root/.m2 entrypoint java -jar /final.jar優(yōu)化后 dockerfile:
        from openjdk:8u171-jdk-alpine3.8 as builder add . /app workdir /app run apk add maven \ && mvn clean package \ && apk del maven \ && mv target/final.jar / from openjdk:8u181-jre-alpine3.8 as environment workdir / copy --from=builder /final.jar . entrypoint java -jar /final.jar 很明顯,優(yōu)化后的 dockerfile 新增了 from as 這個(gè)命令,并出現(xiàn)了兩個(gè) from。這就是多階段構(gòu)建。
        了解一下多階段構(gòu)建
        多階段構(gòu)建是 docker 17.05 的新增功能,它可以在一個(gè) dockerfile 中使用多個(gè) from 語(yǔ)句,以創(chuàng)建多個(gè) stages(階段)。每個(gè)階段間獨(dú)立(來(lái)源請(qǐng)求),可以通過(guò) copy –from 來(lái)獲取其它階段的文件。我們來(lái)打個(gè)比方,把最終鏡像比作一盤菜(炒青椒)。把原料青椒炒完后上桌。
        # 對(duì)比清單 鏡像 -> 一盤菜 第一個(gè)階段 -> 炒 第二個(gè)階段 -> 上桌兩個(gè)階段的目標(biāo)是做好(生成)最終的菜(鏡像)。我們要做的是將第一個(gè)階段「炒」出來(lái)的食物進(jìn)行「上桌」。我們的目標(biāo)是 做出菜,且 菜盤子(盛菜和中間產(chǎn)物)最輕。
        可視化流程如下:
        # 做菜流程 ... 省略原料 原料 -> [第一個(gè)階段——炒] # 此時(shí)盤子里有炒的工具、炒的結(jié)果和中間產(chǎn)物 # 這時(shí)候開啟第二個(gè)階段,只保留炒的結(jié)果,而不再需要其它。 -> 炒的結(jié)果 -> [開始上桌,只保留結(jié)果] # 把炒出來(lái)的青椒拿來(lái)(copy --from),其它不要 -> 最終是一盤菜?,F(xiàn)在應(yīng)該大致理解多階段構(gòu)建的流程了吧。我們把話筒交給 java,看看在 dockerfile 中使用編譯工具構(gòu)建一個(gè) jar,并只保留構(gòu)建完的 jar 和運(yùn)行時(shí)交給 image,其它則扔掉應(yīng)該怎么做:
        # 第一階段——編譯(炒) from openjdk:8u171-jdk-alpine3.8 as builder # 自帶編譯工具 add . /app workdir /app run ... 省略編譯和清理工作... # 現(xiàn)在,jar 已經(jīng)出爐。jdk 不再需要,所以不能留在鏡像中。 # 所以我們開啟第二階段——運(yùn)行(上桌),并扔掉第一階段的所有文件(包括編譯工具) from openjdk:8u181-jre-alpine3.8 as environment # 只帶運(yùn)行時(shí) # 目前,編譯工具等上一階段的東西已經(jīng)被我們拋下。目前的鏡像中只有運(yùn)行時(shí),我們需要把上一階段(炒)的結(jié)果拿來(lái),其它不要。 copy --from=0 /final.jar . # 好了,現(xiàn)在鏡像只有必要的運(yùn)行時(shí)和 jar 了。 entrypoint java -jar /final.jar如上就是多階段構(gòu)建的介紹。
        使用多階段構(gòu)建
        多階段構(gòu)建的核心命令是 from。form 對(duì)于身經(jīng)百戰(zhàn)的你來(lái)說(shuō)已經(jīng)不用多講了。在多階段構(gòu)建中,每次 from 都會(huì)開啟一個(gè)新的 stage(階段),可以看作一個(gè)新的 image(不夠準(zhǔn)確、來(lái)源請(qǐng)求),與其它階段隔離(甚至包括環(huán)境變量)。只有最后的 from 才會(huì)被納入 image 中。
        我們來(lái)做一個(gè)最 simple 的多階段構(gòu)建例子:
        # stage 1 from alpine:3.8 workdir /demo run echo hello, stage 1 > /demo/hi-1.txt # stage 2 from alpine:3.8 workdir /demo run echo hello, stage 2 > /demo/hi-2.txt 可以自己構(gòu)建一下這個(gè) dockerfile,然后 docker save <tag> > docker.tar 看看其中的內(nèi)容。不出意外應(yīng)該只有 /demo/hi-2.txt 和 alpine。
        在這個(gè) dockerfile 中,我們創(chuàng)建了兩個(gè)階段。第一個(gè)階段創(chuàng)建 hi-1.txt,第二個(gè)階段創(chuàng)建 hi-2.txt,且第二個(gè)階段會(huì)被加入最終 image,其它不會(huì)。
        復(fù)制文件——階段間的橋梁
        如果階段間完全隔離,那么多階段就沒(méi)有意義——上一個(gè)階段的結(jié)果會(huì)被完全拋棄,并進(jìn)入全新的下一階段。
        我們可以通過(guò) copy 命令來(lái)獲取其它階段的文件。在多階段中使用 copy 和普通應(yīng)用完全一致,僅需要添加 –form ` 即可。那么,我們修正上一個(gè)例子,使最終鏡像包含兩個(gè)階段的產(chǎn)物:
        # stage 1 from alpine:3.8 workdir /demo run echo hello, stage 1 > /demo/hi-1.txt # stage 2 from alpine:3.8 workdir /demo copy --from=0 /demo/hi-1.txt /demo run echo hello, stage 2 > /demo/hi-2.txt 重新構(gòu)建并保存(save),你會(huì)發(fā)現(xiàn)多了一層 layer,其中包含 hi-1.txt。
        階段命名——快速識(shí)別
        對(duì)于只有七秒記憶的我們來(lái)說(shuō),每次使用 stage index 并不是一件很妙的事情。這時(shí)候,可以通過(guò)階段命名的方式給它們賦予名字,以方便識(shí)別。
        為階段添加名字很簡(jiǎn)單,只需要在 from 后加上 as <name> 即可。
        現(xiàn)在,我們更新 dockerfile,給予階段名稱并使用名稱來(lái) copy。
        # stage 1, it's name is build1 from alpine:3.8 as build1 workdir /demo run echo hello, stage 1 > /demo/hi-1.txt # stage 2, it's name is build2 from alpine:3.8 as build2 workdir /demo # no longer use indexes copy --from=build1 /demo/hi-1.txt /demo run echo hello, stage 2 > /demo/hi-2.txt 重新構(gòu)建并保存,結(jié)果應(yīng)該同上次相同。
        僅構(gòu)建部分階段——輕松調(diào)試
        docker 還為我們提供了一個(gè)很方便的調(diào)試方式——僅構(gòu)建部分階段。它可以使構(gòu)建停在某個(gè)階段,并不構(gòu)建后面的階段。這可以方便我們調(diào)試;區(qū)分生產(chǎn)、開發(fā)和測(cè)試。
        仍然沿用上次的 dockerfile,但使用 –target <stage> 參數(shù)進(jìn)行構(gòu)建:
        $ docker build --target build1 .再次 save,你會(huì)發(fā)現(xiàn)只有 build1 的內(nèi)容。
        總結(jié)
        這就是多階段構(gòu)建的全部用法了。我們?cè)倩氐介_篇的兩個(gè) dockerfile 對(duì)比,你能發(fā)現(xiàn)優(yōu)化前的鏡像胖在哪里了嗎?
        很顯然,它包含了無(wú)用的 jdk,jdk 只在編譯時(shí)起作用,編譯完便無(wú)用了,只需要 jre 即可。所以,利用多階段構(gòu)建可以隔離編譯階段和運(yùn)行階段,以達(dá)到鏡像最優(yōu)化。
        參考文獻(xiàn)
        https://docs.docker.com/develop/develop-images/multistage-build/#name-your-build-stages
        https://yeasy.gitbooks.io/docker_practice/image/multistage-builds.html
        上一個(gè):RC1206DR-0728R7L,1206 28.7Ω 0.5%電阻
        下一個(gè):ems特快件多少錢,EMS特快多少錢

        鋸齒600mm裁布機(jī)
        OJIYAS空氣量規(guī)--春亨工具代理產(chǎn)品
        RC0402JR-0730KL貼片電阻,國(guó)巨原廠代理
        sp,dp,hp型絲網(wǎng)除沫器
        一座抽水蓄能電站,三塊行業(yè)“試驗(yàn)田”!遼寧清原抽水蓄能電站首臺(tái)機(jī)組投產(chǎn)發(fā)電
        電動(dòng)執(zhí)行器的故障主要在電機(jī)和軸承部分
        變頻器多段速初探
        win7正式版鏡像文件怎么下載到電腦(win7正式版鏡像文件怎么下載不了)
        德國(guó)VSE威仕流量計(jì)EF系列EF2AR 064V-PNP/1介紹
        關(guān)于電磁流量計(jì)接線介紹