iT邦幫忙

2023 iThome 鐵人賽

0
DevOps

跟著菜鳥手把手用Docker建立服務系列 第 26

Day26 - 菜鳥們一起深入探討 Docker - Multi Stage 篇

  • 分享至 

  • xImage
  •  

在我們設計一個 Image 時,希望把該用到的資料保留,把不必要的刪除,可能有些資料只用一次,這樣只用一次後面用不到反而留在那會造成 Image 容量變大,今天更近一步來坦探討 Multi Stage /images/emoticon/emoticon07.gif


這邊一個範例
我透過gcc去編譯C語言並且產生執行檔,然後執行

沒用 Multi Stage 的 Dockerfile

FROM gcc:9.4

COPY hello.c /src/hello.c

WORKDIR /src

RUN gcc --static -o hello hello.c

ENTRYPOINT [ "/src/hello" ]

CMD []

https://ithelp.ithome.com.tw/upload/images/20240206/20158512cHsXvdxX9B.png

  • 來查看hello的Size
  • RUN gcc --static -o hello hello.c -> 在/src 編譯 hello.c 檔案,生成一個名為 hello 的可執行檔
  • 當hello.c編譯完以後,就不需要gcc的環境,也就是説gcc有很多沒用到的功能,這樣反而造成容量會比較大

有用Multi Stage 的 Dockerfile

FROM gcc:9.4 AS builder

COPY hello.c /src/hello.c

WORKDIR /src

RUN gcc --static -o hello hello.c


FROM alpine:3.13.5

COPY --from=builder /src/hello /src/hello

ENTRYPOINT [ "/src/hello" ]

https://ithelp.ithome.com.tw/upload/images/20240206/20158512iAYvqLb5SR.png

  • 來查看hello-alpine的Size
  • 第一階(gcc)負責編譯
    第二階(alpine)負責執行

Multi Stage 用法講解

  • 創建後只會保留最後一個Image,前面不管多少個Image執行完就會刪除
  • COPY --from==builder /src/hello /src/hello
    • builder -> 為gcc:9.4的別名
    • /src/hello /src/hello -> 把 gcc的/src/hello 複製到 alpine /src/hello
  • 設定容器的默認入口點為 /src/hello。這表示當容器啟動時,將執行該可執行檔
  • 看似用兩個Image感覺Size會更大,但是其實不是,因為gcc也只負責編譯時候產生執行檔,最終結果是要透過執行檔去呈現結果,所以gcc產生完就會刪掉,所以Size才會比較小

Multi Stage 額外好處:

  • 在前面有說過在Dockerfile一個指令會存一層Layer,這邊也可以從Layer去讀取你的資料,如果你在Dockerfile指令有寫一些機密的參數例如 “SSH_PRIVATE_KEY”,本來自己要保管好的卻公諸於世,Multi Stage 可以解決這個問題,但Multi Stage最主要是精簡Image容量變小為重點

如果一直探討細節下去,就會發現有更多更好的方法,能讓Docker負擔小一點,就有種發現新大陸的感覺/images/emoticon/emoticon12.gif


上一篇
Day25 - 菜鳥們一起深入探討 Docker - Image Layer 篇
下一篇
Day27 - 菜鳥們一起深入探討 Docker - Copy 篇
系列文
跟著菜鳥手把手用Docker建立服務30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言