Docker image的多階段構建

Jason
Nov 8, 2023

--

什麼是多階段構建?

Multi-stage builds are useful to anyone who has struggled to optimize Dockerfiles while keeping them easy to read and maintain.

將一個image編譯完的檔案放入另一個image的行為,這就是多階段建構,目的在於優化 Dockerfile。

為什麼要多階段建構?

在這個雲端部屬,每一個佈署空間及效能都是要錢的時代,減少最終image的大小會減少儲存根傳遞成本,而能為老闆省錢,老闆會覺得這是你應該做的

提升效更好的效能,因容器更小所啟動的時間更短佔用的資源更少

開發和建置環境與生產環境分開,有助於降低生產環境的複雜性,提高可維護性

並且可以增加安全性,你不會好奇在Docker Hub抓下來的image有大有小,是為什麼嗎?

image通常較大的,是因為它包含許多構建和開發工具,而image較小的只有執行環境沒有額外的開發工具,少了開發工具也減少了淺在地攻擊。

例子

FROM node:lts-hydrogen
WORKDIR /src
COPY . /src
RUN npm install && \
npm install -g nodemon
EXPOSE 3000
ENTRYPOINT [ "npm", "run" ]
CMD ["dev"]

改成

# 第一階段:用於建立應用程式
FROM node:lts-hydrogen AS builder
WORKDIR /src
COPY . /src
RUN npm install

# 第二個階段:用於運行應用程式
FROM node:21.1-slim
WORKDIR /src
# --from 前面的 builder,將builder的/src目錄複製到 /src
COPY --from=builder /src /src
# 將nodemon -g 裝在 node:21.1-slim 環境
RUN npm install -g nodemon
EXPOSE 3000
ENTRYPOINT [ "npm", "run" ]
CMD ["dev"]

結論

從1.1G的image瘦身到261MB,空間節省打快2折,而且還可以減少儲存跟傳遞成本、提升運行效率、增加安全性、提高維護性,這麼香怎麼可以不知道!

--

--