亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

使用Docker多階段構建來減小鏡像大小的方法

2024-09-01 13:56:14
字體:
來源:轉載
供稿:網友

本文講述了如何通過 Docker 的多階段構建功能來大幅度減小鏡像大小,適用于需要在 Dockerfile 中構建程式(如 javac),且需要另外安裝編譯工具鏈的鏡像。(如 Java)

先來學習單詞(本文全部采用中文詞匯,如需查詢外文文檔可對照該詞匯表。理論上個人不贊成翻譯術語):

  • multi-stage 多階段
  • build 構建
  • image 鏡像
  • stage 階段

再來看一下效果: 原 110M+,現 92M。

對比一下 Dockerfile

優化前 Dockerfile:

FROM openjdk:8u171-jdk-alpine3.8ADD . /appWORKDIR /appRUN apk add maven /  && mvn clean package /  && apk del maven /  && mv target/final.jar / /  && cd / /  && rm -rf /app /  && rm -rf /root/.m2ENTRYPOINT java -jar /final.jar

優化后 Dockerfile:

FROM openjdk:8u171-jdk-alpine3.8 as builderADD . /appWORKDIR /appRUN apk add maven /  && mvn clean package /  && apk del maven /  && mv target/final.jar /FROM openjdk:8u181-jre-alpine3.8 as environmentWORKDIR /COPY --from=builder /final.jar .ENTRYPOINT java -jar /final.jar

很明顯,優化后的 Dockerfile 新增了 FROM AS 這個命令,并出現了兩個 FROM。這就是多階段構建。

了解一下多階段構建

多階段構建是 Docker 17.05 的新增功能,它可以在一個 Dockerfile 中使用多個 FROM 語句,以創建多個 Stages(階段)。每個階段間獨立(來源請求),可以通過 COPY --from 來獲取其它階段的文件。我們來打個比方,把最終鏡像比作一盤菜(炒青椒)。把原料青椒炒完后上桌。

# 對比清單鏡像 -> 一盤菜第一個階段 -> 炒第二個階段 -> 上桌

兩個階段的目標是做好(生成)最終的菜(鏡像)。我們要做的是將第一個階段「炒」出來的食物進行「上桌」。我們的目標是 做出菜,且 菜盤子(盛菜和中間產物)最輕。

可視化流程如下:

# 做菜流程... 省略原料原料 -> [第一個階段——炒] # 此時盤子里有炒的工具、炒的結果和中間產物# 這時候開啟第二個階段,只保留炒的結果,而不再需要其它。-> 炒的結果 -> [開始上桌,只保留結果] # 把炒出來的青椒拿來(COPY --from),其它不要-> 最終是一盤菜。

現在應該大致理解多階段構建的流程了吧。我們把話筒交給 Java,看看在 Dockerfile 中使用編譯工具構建一個 JAR,并只保留構建完的 JAR 和運行時交給 Image,其它則扔掉應該怎么做:

# 第一階段——編譯(炒)FROM openjdk:8u171-jdk-alpine3.8 as builder # 自帶編譯工具ADD . /appWORKDIR /appRUN ... 省略編譯和清理工作...# 現在,JAR 已經出爐。JDK 不再需要,所以不能留在鏡像中。# 所以我們開啟第二階段——運行(上桌),并扔掉第一階段的所有文件(包括編譯工具)FROM openjdk:8u181-jre-alpine3.8 as environment # 只帶運行時# 目前,編譯工具等上一階段的東西已經被我們拋下。目前的鏡像中只有運行時,我們需要把上一階段(炒)的結果拿來,其它不要。COPY --from=0 /final.jar .# 好了,現在鏡像只有必要的運行時和 JAR 了。ENTRYPOINT java -jar /final.jar

如上就是多階段構建的介紹。

使用多階段構建

多階段構建的核心命令是 FROM。FORM 對于身經百戰的你來說已經不用多講了。在多階段構建中,每次 FROM 都會開啟一個新的 Stage(階段),可以看作一個新的 Image(不夠準確、來源請求),與其它階段隔離(甚至包括環境變量)。只有最后的 FROM 才會被納入 Image 中。

我們來做一個最 simple 的多階段構建例子:

# Stage 1FROM alpine:3.8WORKDIR /demoRUN echo "Hello, stage 1" > /demo/hi-1.txt# Stage 2FROM alpine:3.8WORKDIR /demoRUN echo "Hello, stage 2" > /demo/hi-2.txt

可以自己構建一下這個 Dockerfile,然后 docker save <tag> > docker.tar 看看其中的內容。不出意外應該只有 /demo/hi-2.txt 和 Alpine。

在這個 Dockerfile 中,我們創建了兩個階段。第一個階段創建 hi-1.txt,第二個階段創建 hi-2.txt,且第二個階段會被加入最終 Image,其它不會。

復制文件——階段間的橋梁

如果階段間完全隔離,那么多階段就沒有意義——上一個階段的結果會被完全拋棄,并進入全新的下一階段。

我們可以通過 COPY 命令來獲取其它階段的文件。在多階段中使用 COPY 和普通應用完全一致,僅需要添加 –form ` 即可。那么,我們修正上一個例子,使最終鏡像包含兩個階段的產物:

# Stage 1FROM alpine:3.8WORKDIR /demoRUN echo "Hello, stage 1" > /demo/hi-1.txt# Stage 2FROM alpine:3.8WORKDIR /demoCOPY --from=0 /demo/hi-1.txt /demoRUN echo "Hello, stage 2" > /demo/hi-2.txt

重新構建并保存(Save),你會發現多了一層 Layer,其中包含 hi-1.txt。

階段命名——快速識別

對于只有七秒記憶的我們來說,每次使用 stage index 并不是一件很妙的事情。這時候,可以通過階段命名的方式給它們賦予名字,以方便識別。

為階段添加名字很簡單,只需要在 FROM 后加上 as <name> 即可。

現在,我們更新 Dockerfile,給予階段名稱并使用名稱來 COPY。

# Stage 1, it's name is "build1"FROM alpine:3.8 as build1WORKDIR /demoRUN echo "Hello, stage 1" > /demo/hi-1.txt# Stage 2, it's name is "build2"FROM alpine:3.8 as build2WORKDIR /demo# No longer use indexesCOPY --from=build1 /demo/hi-1.txt /demoRUN echo "Hello, stage 2" > /demo/hi-2.txt

重新構建并保存,結果應該同上次相同。

僅構建部分階段——輕松調試

Docker 還為我們提供了一個很方便的調試方式——僅構建部分階段。它可以使構建停在某個階段,并不構建后面的階段。這可以方便我們調試;區分生產、開發和測試。

仍然沿用上次的 Dockerfile,但使用 --target <stage> 參數進行構建:

$ docker build --target build1 .

再次 Save,你會發現只有 build1 的內容。

總結

這就是多階段構建的全部用法了。我們再回到開篇的兩個 Dockerfile 對比,你能發現優化前的鏡像胖在哪里了嗎?

很顯然,它包含了無用的 JDK,JDK 只在編譯時起作用,編譯完便無用了,只需要 JRE 即可。所以,利用多階段構建可以隔離編譯階段和運行階段,以達到鏡像最優化。

參考文獻

https://docs.docker.com/develop/develop-images/multistage-build/#name-your-build-stages

https://yeasy.gitbooks.io/docker_practice/image/multistage-builds.html

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线中文字幕日韩| 96pao国产成视频永久免费| 久久影视电视剧免费网站| 国产成人精品日本亚洲专区61| 国产91九色视频| 亚洲一区www| 最近免费中文字幕视频2019| 精品久久久久久中文字幕| 日韩激情第一页| 国产欧美久久久久久| 成人久久一区二区三区| 亚洲色图25p| 亚洲国产欧美一区二区丝袜黑人| 欧美性资源免费| 操91在线视频| 国产精品日日摸夜夜添夜夜av| 日韩免费在线视频| 精品网站999www| 91国内产香蕉| 日韩动漫免费观看电视剧高清| 日韩a**中文字幕| 欧美性感美女h网站在线观看免费| www国产91| 亚洲欧美自拍一区| 国产不卡视频在线| 日韩电影免费观看在线观看| 亚洲国产欧美日韩精品| 欧美日韩国产中文字幕| 操91在线视频| 日韩综合中文字幕| 国产精品视频最多的网站| 色多多国产成人永久免费网站| 欧美裸体xxxx| 亚洲精品一区二区网址| 精品福利樱桃av导航| 亚洲丝袜av一区| 国产视频亚洲精品| 成人久久久久爱| 亚洲美女av网站| 国产一区二区三区在线| 国产精品视频成人| 欧美日韩一区二区在线播放| 久久青草精品视频免费观看| 91麻豆国产精品| 国产精品偷伦免费视频观看的| 欧美日韩精品在线| 色综合久久中文字幕综合网小说| 日本道色综合久久影院| 欧美日韩ab片| 日韩国产精品亚洲а∨天堂免| 国产69精品久久久久9| 欧美日产国产成人免费图片| 国产69精品久久久久9999| 欧美精品情趣视频| 日韩中文字幕av| 亚洲第一免费网站| 日韩最新中文字幕电影免费看| 亚洲一区美女视频在线观看免费| 亚洲成人aaa| 奇米一区二区三区四区久久| 国产欧美在线视频| 国产不卡精品视男人的天堂| 亚洲欧美国产精品va在线观看| 中文字幕一区二区精品| 亚洲在线免费视频| 亚洲女性裸体视频| 亚洲伊人久久大香线蕉av| 九色91av视频| 国内精品400部情侣激情| 91精品一区二区| 国产精品69久久久久| 久久精品视频播放| 国产精品∨欧美精品v日韩精品| 97精品在线视频| 亚洲精品国产电影| 欧美一级淫片播放口| 久久免费观看视频| 91国产高清在线| 国产日韩换脸av一区在线观看| 国产精品久久久久久久久久小说| 影音先锋日韩有码| 精品亚洲一区二区三区四区五区| 欧美主播福利视频| 亚洲精品美女久久| 日本欧美在线视频| 国产精品美腿一区在线看| 91精品国产综合久久男男| 亚洲欧美中文在线视频| 亚洲一区二区免费在线| 亚洲亚裔videos黑人hd| 久久久av亚洲男天堂| 久久久久久久久久亚洲| 日韩免费在线电影| 日韩激情av在线播放| 欧美精品成人91久久久久久久| 久久全球大尺度高清视频| 青青草一区二区| 国产亚洲精品91在线| 97色在线播放视频| 91国内精品久久| 色av中文字幕一区| 亚洲视频专区在线| 另类图片亚洲另类| 欧美精品videos另类日本| 欧美视频精品一区| 亚洲成人三级在线| 国产精品美女主播在线观看纯欲| 国产一区二区三区久久精品| 亚洲电影在线观看| 久久精品国产69国产精品亚洲| 久久久999精品视频| 久久亚洲影音av资源网| 国产精品福利片| 亚洲第一中文字幕在线观看| 久久频这里精品99香蕉| 中文字幕日韩在线播放| 亚洲视频一区二区| 亚洲春色另类小说| 亚洲一区亚洲二区| 国产欧美精品一区二区三区介绍| 成人性教育视频在线观看| 精品久久久久久中文字幕一区奶水| 欧美电影在线观看高清| 欧美体内谢she精2性欧美| 亚洲图中文字幕| 欧美国产精品人人做人人爱| 高清日韩电视剧大全免费播放在线观看| 97成人精品区在线播放| 欧美激情欧美激情在线五月| 日韩中文字幕在线视频播放| 欧美日韩国产成人| 久久久精品欧美| 成人久久精品视频| 久久香蕉国产线看观看av| 日韩视频免费在线| 97国产suv精品一区二区62| 亚洲www永久成人夜色| 亚洲已满18点击进入在线看片| 欧美成aaa人片在线观看蜜臀| 久久精品国产2020观看福利| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲影视九九影院在线观看| 国产91精品高潮白浆喷水| 456国产精品| 久久视频这里只有精品| 国产精品爱久久久久久久| 亚洲热线99精品视频| 国产丝袜一区二区三区免费视频| 中文字幕久久亚洲| 欧美成人免费在线视频| 国产欧美日韩中文字幕| 久久影院中文字幕| 国产成人一区二区三区电影| 国产精品成av人在线视午夜片| 成人性生交大片免费看小说| 98精品国产高清在线xxxx天堂| 97国产精品人人爽人人做| 136fldh精品导航福利| xxxx欧美18另类的高清| 国产精品一区二区电影| 亚洲一区二区三区香蕉| 欧美色视频日本高清在线观看| 欧美有码在线观看视频| 中日韩美女免费视频网址在线观看|