Docker 多階段構建(Multi-stage Build)的實戰技巧?

多階段構建通過分階段使用不同鏡像提升鏡像效率與安全性。其核心好處是減小體積、提高安全性和可能加快構建速度。具體實現包括:1. 明確應用運行所需依賴和文件;2. 構建階段選擇含工具的鏡像,運行階段選擇輕量鏡像;3. dockerfile 中使用多個 from 指令定義階段,并通過 copy –from= 引用前一階段產物;4. 構建并驗證鏡像。優化方法包括利用緩存、清理臨時文件、使用 .dockerignore 和更小基礎鏡像。常見問題需注意依賴缺失、權限問題、環境變量差異和緩存失效。在 ci/cd 中可用于集成構建測試、安全掃描和鏡像推送流程。

Docker 多階段構建(Multi-stage Build)的實戰技巧?

Docker 多階段構建,簡單來說,就是在一個 Dockerfile 里使用多個 FROM 指令。這樣做的好處?體積更小,安全更高,構建速度可能更快!直接理解成“搭積木”,先用一個鏡像編譯,再用另一個鏡像把編譯好的東西搬過去,就完事兒了。

解決方案

多階段構建的核心思想是將構建過程分解為多個階段,每個階段使用不同的基礎鏡像,最終只保留最終運行所需的最小依賴。這聽起來有點像軟件工程里的“最小權限原則”。

  1. 明確需求: 首先,你需要明確你的應用運行需要哪些依賴,哪些文件。哪些是構建時需要的,哪些是運行時需要的?

  2. 選擇基礎鏡像: 選擇合適的基礎鏡像至關重要。構建階段可以選擇包含所有構建工具的鏡像,例如 maven 或 Node.JS 鏡像。運行階段則可以選擇更輕量級的鏡像,例如 Alpine linux 或 distroless 鏡像。

  3. 編寫 Dockerfile: 在 Dockerfile 中,使用 FROM 指令定義每個階段。每個 FROM 指令都創建一個新的構建階段。你可以為每個階段命名,方便后續引用。

    # 構建階段 FROM maven:3.8.6-jdk-11 AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean install -DskipTests  # 運行階段 FROM openjdk:11-jre-slim WORKDIR /app COPY --from=builder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["Java", "-jar", "app.jar"]

    這個例子中,maven:3.8.6-jdk-11 用于構建 Java 應用,openjdk:11-jre-slim 用于運行。COPY –from=builder 指令將構建階段生成的 jar 包復制到運行階段。注意 –from=builder 這里的 builder 就是上面 FROM maven… AS builder 里的別名。

  4. 構建鏡像: 使用 docker build 命令構建鏡像。

    docker build -t my-app .
  5. 驗證: 構建完成后,運行鏡像并驗證其功能是否正常。

如何優化 Docker 多階段構建?

優化多階段構建,其實就是在精簡鏡像體積上下功夫。畢竟,小即是美。

  1. 利用緩存: Docker 鏡像層具有緩存機制。如果 Dockerfile 中的指令沒有發生變化,Docker 會直接使用緩存,避免重復執行。所以,盡量將不常變化的指令放在前面,例如安裝依賴。

  2. 清理臨時文件: 在每個階段結束時,清理不再需要的臨時文件。例如,在構建階段編譯完成后,可以刪除源代碼和構建工具。

  3. 使用 .dockerignore 文件: .dockerignore 文件用于排除不需要的文件和目錄,例如日志文件、構建緩存等。這可以減小鏡像體積,提高構建速度。

  4. 選擇更小的基礎鏡像: 不同的基礎鏡像體積差異很大。例如,Alpine Linux 鏡像體積非常小,適合作為運行階段的基礎鏡像。Distroless 鏡像則更進一步,只包含運行應用所需的最小依賴。

多階段構建的常見坑有哪些?

多階段構建雖好,但也有一些坑需要注意。

  1. 依賴缺失: 確保運行階段的基礎鏡像包含應用運行所需的所有依賴。如果依賴缺失,應用可能無法啟動或運行出錯。

  2. 文件權限問題: 從一個階段復制到另一個階段的文件,可能會出現權限問題。確保目標階段具有訪問這些文件的權限。

  3. 環境變量: 不同階段的環境變量可能不同。確保在每個階段設置正確的環境變量。

  4. 緩存失效: 如果 Dockerfile 中的指令發生變化,緩存就會失效。這會導致 Docker 重新執行所有指令,增加構建時間。

  5. 構建上下文: docker build 命令的構建上下文是指 Dockerfile 所在的目錄。確保構建上下文中包含所有需要的文件。

多階段構建在 CI/CD 中的應用?

在 CI/CD 流水線中,多階段構建可以發揮更大的作用。

  1. 構建和測試: 可以使用一個階段進行構建和單元測試,另一個階段進行集成測試。

  2. 安全掃描: 可以在構建階段進行安全掃描,例如漏洞掃描和靜態代碼分析。

  3. 鏡像推送: 只有通過所有測試和安全掃描的鏡像才能被推送到鏡像倉庫。

通過將構建、測試和安全掃描集成到多階段構建中,可以提高軟件質量和安全性,并實現持續交付。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享