使用 Multi-stage Build 高效建構輕量化 Docker 映像
前言:
在軟體開發的流程中,打包應用程式是一個不可或缺的環節,通常需要經歷下載依賴、編譯程式碼、打包應用,然後執行的步驟。傳統的 Dockerfile 會將所有這些步驟集中在同一個建構過程中,雖然操作簡單直觀,但也伴隨著一些潛在的問題。今天,我們要介紹 Docker Multi-stage Build 這個強大工具,看看它如何幫助我們優化建構流程並提升應用部署的效率。
認識 Docker Multi-stage Build
傳統 Dockerfile 的挑戰
在傳統的 Dockerfile 中,我們建構映像的過程通常包含所有步驟,從下載依賴到編譯應用程式。舉個例子,這是一個常見的 Dockerfile:
Dockerfile
FROM golang:1.16.0-alpine3.13
WORKDIR /app
# 複製 go module 和 sum 檔案並下載依賴
COPY go.mod go.sum ./
RUN go mod download
# 複製所有原始碼
COPY . .
# 執行程式碼檢查、測試及編譯
RUN go vet ./... && go test ./... && go build -o /app/server
CMD ["/app/server"]
這樣的 Dockerfile 執行了所有步驟,包括下載依賴、程式碼檢查、測試和編譯。而在映像建構完成後,所有這些步驟的產物,甚至是編譯器、開發工具和測試用的依賴,通通都會被保留下來,導致映像非常龐大。
這樣的巨大映像檔會造成幾個問題。首先,映像越大,部署速度就越慢,尤其是當你需要頻繁更新應用程式時。其次,映像中包含不必要的工具和依賴,增加了安全風險和潛在的攻擊面。