校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 使用Docker多階段構建來減小鏡像大小的方法

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

熱門標簽:外呼系統不彈窗 外呼系統的經營范圍 云會外呼系統 廈門營銷外呼系統平臺 安陽ai電銷機器人軟件 申請400電話價格多少 智能電話機器人坐席 涪陵商都400電話開通辦理 柳州市機器人外呼系統報價

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

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

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

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

對比一下 Dockerfile

優化前 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

優化后 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

很明顯,優化后的 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 . /app
WORKDIR /app

RUN ... 省略編譯和清理工作...

# 現在,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 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

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

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

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

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

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

# 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

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

階段命名——快速識別

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

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

現在,我們更新 Dockerfile,給予階段名稱并使用名稱來 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

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

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

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

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

標簽:南充 巴中 蕪湖 孝感 福州 綏化 撫順 晉城

巨人網絡通訊聲明:本文標題《使用Docker多階段構建來減小鏡像大小的方法》,本文關鍵詞  使用,Docker,多,階段,構建,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用Docker多階段構建來減小鏡像大小的方法》相關的同類信息!
  • 本頁收集關于使用Docker多階段構建來減小鏡像大小的方法的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    成人毛片在线观看| 99精品黄色片免费大全| 国产日韩欧美一区二区三区综合| 日韩精品色哟哟| 国产精品综合二区| 国产亚洲午夜高清国产拍精品| 一区二区三区四区五区视频在线观看| 97久久精品人人澡人人爽| 国产精品福利一区二区三区| 久久99国内精品| 成人精品电影在线观看| 久久久综合九色合综国产精品| 国产麻豆精品视频| 亚洲国产精品久久久久秋霞影院| av电影一区二区| 精品一区二区三区的国产在线播放 | 成人app下载| 欧美一二区视频| 日产精品久久久久久久性色| 欧美日韩免费一区二区三区 | 国产香蕉久久精品综合网| 日韩av中文字幕一区二区| 欧美va亚洲va香蕉在线| 免费精品视频在线| 精品粉嫩超白一线天av| 粉嫩一区二区三区在线看| 国产日韩欧美a| 大胆亚洲人体视频| 亚洲高清免费视频| 欧美激情一区二区三区蜜桃视频 | 日韩高清在线不卡| 欧美视频完全免费看| www.视频一区| 首页欧美精品中文字幕| 亚洲国产视频直播| 日本vs亚洲vs韩国一区三区| 成人中文字幕合集| 精品精品国产高清a毛片牛牛 | 日韩亚洲欧美高清| 国产精品国产三级国产三级人妇| 亚洲最新视频在线播放| 美美哒免费高清在线观看视频一区二区| 韩国欧美国产1区| 在线视频国内一区二区| 亚洲欧美日韩国产成人精品影院| 久久成人精品无人区| 午夜a成v人精品| 蜜桃av一区二区| 麻豆精品在线播放| 国产精品1区2区3区在线观看| 日韩电影一区二区三区| 午夜私人影院久久久久| 精品一区二区三区视频| 精彩视频一区二区| 成人午夜激情视频| 99精品欧美一区二区三区小说 | 日韩精品一区二区三区蜜臀| 欧美色精品在线视频| 欧美日本在线播放| 久久新电视剧免费观看| 亚洲男人电影天堂| 日本美女一区二区| 粉嫩嫩av羞羞动漫久久久| 99久久婷婷国产综合精品电影| 在线亚洲高清视频| 精品女同一区二区| 一区二区在线观看不卡| 久久99精品国产91久久来源| 色一情一伦一子一伦一区| 欧美一区二区视频网站| 全国精品久久少妇| 亚洲图片欧美一区| 国产成人综合亚洲91猫咪| 日韩avvvv在线播放| 亚洲丝袜美腿综合| 久久国产日韩欧美精品| 91视频观看免费| 青青草97国产精品免费观看| 亚洲电影第三页| 日韩女同互慰一区二区| 欧美肥妇bbw| 午夜一区二区三区在线观看| 在线亚洲精品福利网址导航| 一区二区三区91| 欧美日韩欧美一区二区| 日本中文字幕一区二区视频| 91精品国产91久久综合桃花| 久久99精品国产麻豆不卡| 日韩区在线观看| 精品成a人在线观看| 国产精品亚洲人在线观看| 日韩一级在线观看| 精品一区二区三区影院在线午夜| 在线看不卡av| 中文字幕一区二区三区不卡| 国产精品88888| 亚洲欧美偷拍三级| 91福利精品视频| 亚洲mv在线观看| 日韩精品一区二区在线| 精品一区二区三区久久久| 一区二区三区鲁丝不卡| 精品视频一区二区三区免费| 日韩精品亚洲一区| 久久一夜天堂av一区二区三区| 懂色av一区二区在线播放| 成人欧美一区二区三区小说| 欧美在线观看视频一区二区三区| 天堂影院一区二区| 精品国产a毛片| 91一区二区在线观看| 亚洲高清不卡在线观看| 中文字幕精品—区二区四季| 在线视频亚洲一区| 色婷婷久久久久swag精品| 丝袜亚洲另类欧美综合| 亚洲乱码精品一二三四区日韩在线| 国精产品一区一区三区mba桃花| 欧美成人国产一区二区| 看片的网站亚洲| 亚洲成a人片在线不卡一二三区| 一区二区在线看| 99久久精品国产一区| 91精品国产91久久久久久一区二区| 亚洲永久免费av| 黄色日韩三级电影| 午夜久久久影院| 日韩码欧中文字| 26uuuu精品一区二区| 欧美性生活大片视频| 成人性生交大片免费看中文| 三级一区在线视频先锋| 亚洲激情五月婷婷| 国产成人自拍在线| 亚洲人吸女人奶水| 欧美日产在线观看| 欧美日韩一区国产| 日本韩国欧美一区| 欧美性猛交xxxx黑人交| 91麻豆自制传媒国产之光| 欧美日韩一区不卡| 欧美电影一区二区| 欧美电影免费观看高清完整版在 | 7777女厕盗摄久久久| 欧美草草影院在线视频| 亚洲精品一区二区精华| 国产精品视频观看| 亚洲人成精品久久久久久| 亚洲三级在线看| 日韩电影在线一区二区| 久久99最新地址| 99视频有精品| 精品三级在线观看| 国产清纯在线一区二区www| 国产亚洲婷婷免费| 天天免费综合色| 国产成人自拍网| 91麻豆精品国产91久久久更新时间 | 日日摸夜夜添夜夜添亚洲女人| 亚洲国产精品ⅴa在线观看| 日日噜噜夜夜狠狠视频欧美人| 国产精品天天看| 国产欧美日韩麻豆91| 国产精品美女视频| 国产麻豆成人精品| 国产成人免费视频一区| 丰满少妇在线播放bd日韩电影| 国产精品亚洲一区二区三区妖精 | 一区二区三区小说| 樱花草国产18久久久久| 亚洲综合一区二区三区| 99re这里只有精品首页| 亚洲国产视频在线| 色婷婷综合五月| 亚洲欧美激情视频在线观看一区二区三区 | 国产在线国偷精品免费看| 99麻豆久久久国产精品免费| 91精品办公室少妇高潮对白| 久久久无码精品亚洲日韩按摩| 免费人成网站在线观看欧美高清| 99久久精品国产麻豆演员表| 精品日韩欧美一区二区| 亚洲成人动漫在线免费观看| 色综合网站在线| 亚洲激情男女视频| 欧美少妇一区二区| 日产欧产美韩系列久久99| 欧美日韩国产天堂| 日韩黄色免费网站| 精品少妇一区二区三区在线播放 | 欧美精品aⅴ在线视频| 一区二区在线观看不卡| 欧美色图一区二区三区| 亚洲美女少妇撒尿| 欧美日韩国产片| 国内精品自线一区二区三区视频| 亚洲精品一区二区三区影院| 国产黄人亚洲片| 天使萌一区二区三区免费观看| 欧美日韩国产一区|