多階段建構
說明
在傳統建構中,所有建構指令都會依序在單一建構容器中執行:下載依賴項、編譯程式碼和打包應用程式。所有這些層最終都會出現在您的最終映像檔中。這種方法有效,但它会导致映像檔過大,帶來不必要的負擔並增加您的安全風險。這就是多階段建構的用武之地。
多階段建構在 Dockerfile 中引入了多個階段,每個階段都有特定用途。可以將其想像成能夠在多個不同環境中同時執行建構的不同部分。透過將建構環境與最終執行階段環境分離,您可以顯著減小映像檔大小和攻擊面。這對於具有大量建構依賴項的應用程式特別有益。
建議所有類型的應用程式都使用多階段建構。
- 對於直譯語言,例如 JavaScript、Ruby 或 Python,您可以在一個階段中建構和縮小程式碼,然後將可供生產環境使用的檔案複製到較小的執行階段映像檔。這可以最佳化您的映像檔以進行部署。
- 對於編譯語言,例如 C、Go 或 Rust,多階段建構允許您在一個階段中進行編譯,然後將編譯後的二進位檔複製到最終執行階段映像檔。無需在最終映像檔中捆綁整個編譯器。
以下是以虛擬程式碼為例的多階段建構結構的簡化範例。請注意,有多個 FROM
陳述式和一個新的 AS <階段名稱>
。此外,第二階段中的 COPY
陳述式正從前一階段複製 --from
。
# Stage 1: Build Environment
FROM builder-image AS build-stage
# Install build tools (e.g., Maven, Gradle)
# Copy source code
# Build commands (e.g., compile, package)
# Stage 2: Runtime environment
FROM runtime-image AS final-stage
# Copy application artifacts from the build stage (e.g., JAR file)
COPY --from=build-stage /path/in/build/stage /path/to/place/in/final/stage
# Define runtime configuration (e.g., CMD, ENTRYPOINT)
此 Dockerfile 使用兩個階段
- 建構階段使用包含編譯應用程式所需的建構工具的基本映像檔。它包含安裝建構工具、複製原始程式碼和執行建構指令的指令。
- 最後階段使用適合執行應用程式的小型基本映像檔。它從建構階段複製編譯後的成品(例如 JAR 檔案)。最後,它定義用於啟動應用程式的執行階段設定(使用
CMD
或ENTRYPOINT
)。
試用看看
在本實作指南中,您將瞭解多階段建構的強大功能,以便為範例 Java 應用程式建立精簡且高效的 Docker 映像檔。您將使用以 Maven 建構的簡單「Hello World」Spring Boot 應用程式作為範例。