首頁 >運維 >Docker >如何在Docker中使用多級版本來創建較小,更安全的圖像?

如何在Docker中使用多級版本來創建較小,更安全的圖像?

Johnathan Smith
Johnathan Smith原創
2025-03-14 14:15:35451瀏覽

如何在Docker中使用多級版本來創建較小,更安全的圖像?

Docker中的多級版本是一項功能,它允許您使用Dockerfile中的FROM中的多個。每個FROM都可以啟動構建過程的新階段,您可以將工件從一個階段複製到另一個階段。該方法對於通過將構建環境與運行時環境區分開來創建較小,更安全的Docker圖像特別有用。

這是您可以使用多階段構建來實現這一目標的方法:

  1. 定義構建階段:首先定義一個構建階段,在該階段中,您可以編譯應用程序或準備工件。例如,您可以使用golang圖像來編譯GO應用程序。

     <code class="Dockerfile">FROM golang:1.16 as builder WORKDIR /app COPY . . RUN go build -o myapp</code>
  2. 定義運行時階段:在構建階段之後,用最小的基本圖像定義運行時階段。僅將構建階段的必要工件複製到此運行時階段。

     <code class="Dockerfile">FROM alpine:3.14 COPY --from=builder /app/myapp /myapp CMD ["/myapp"]</code>

通過使用多階段構建,您最終獲得了最終圖像,該圖像僅包含運行您的應用程序所需的內容,該應用程序要小得多,並且與用於構建的圖像相比,它具有更少的潛在漏洞。

在多階段碼頭版中組織代碼的最佳實踐是什麼?

在多階段的Docker構建中有效地組織代碼可以大大提高您的Dockerfile的效率和清晰度。以下是一些最佳實踐:

  1. 單獨的問題:將不同的階段用於不同的目的(例如,建築物,測試和部署)。這種關注的分離使您的Dockerfile更容易理解和維護。

     <code class="Dockerfile"># Build stage FROM node:14 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Test stage FROM node:14 as tester WORKDIR /app COPY --from=builder /app . RUN npm run test # Runtime stage FROM node:14-alpine WORKDIR /app COPY --from=builder /app/build /app/build CMD ["node", "app/build/index.js"]</code>
  2. 最小化層的數量:在可能的情況下組合運行命令以減少圖像中的層數。這種練習不僅加快了構建過程,而且還使結果圖像較小。

     <code class="Dockerfile">RUN apt-get update && \ apt-get install -y some-package && \ rm -rf /var/lib/apt/lists/*</code>
  3. 使用.dockerignore :創建一個.dockerignore文件,以排除不必要的文件被複製到Docker構建上下文中。這加快了構建過程並降低圖像大小。
  4. 優化複製操作:僅複製每個階段所需的文件。例如,在node.js應用程序的構建階段中,您可以首先複製package.json ,運行npm install ,然後復制應用程序的其餘部分。
  5. 使用名稱階段:在您的階段給出有意義的名稱,以使Dockerfile易於閱讀和維護。

如何優化多階段Docker構建中的緩存以改善構建時間?

在多階段碼頭版中優化緩存可以大大減少構建時間。以下是實現這一目標的幾種策略:

  1. 操作順序:將經常更改的命令放在Dockerfile的盡頭。 Docker將從Dockerfile的開頭緩存層,從而加快後續構建。

     <code class="Dockerfile">FROM node:14 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build</code>

    在此示例中, npm install更改可能性較小,因此已放置在COPY . .命令。

  2. 使用多階段構建:每個階段都可以獨立緩存。這意味著您可以在每個階段利用構建緩存,從而節省後續版本的時間。
  3. Leverage BuildKit :Docker BuildKit提供了改進的構建緩存機制。通過設置環境變量DOCKER_BUILDKIT=1啟用buildKit,然後使用新的RUN --mount命令來安裝緩存目錄。

     <code class="Dockerfile"># syntax=docker/dockerfile:experimental FROM golang:1.16 as builder RUN --mount=type=cache,target=/root/.cache/go-build \ go build -o myapp</code>
  4. 最小化Docker構建上下文:使用.dockerignore文件將不必要的文件從構建上下文中排除。較小的上下文意味著更少的數據傳輸和更快的構建。
  5. 使用特定的基本圖像:使用輕質和穩定的基本圖像減少在構建過程中拉動基層所需的時間。

與單級版本相比,多階段碼頭版提供哪些安全益處?

與單級版本相比,多階段的Docker Build提供了一些安全優勢:

  1. 較小的圖像大小:通過僅將必要的工件從構建階段複製到運行時階段,多階段的構建會導致更小的最終圖像。較小的圖像具有降低的攻擊表面,因為它們包含較少的組件可能脆弱。
  2. 減少漏洞:由於最終圖像不包括構建工具或依賴性僅在構建過程中所需的依賴性,因此攻擊者在這些工具中利用漏洞的機會更少。
  3. 構建和運行時環境的隔離:多階段構建使您可以使用不同的基本圖像來構建和運行應用程序。構建環境可以更具允許性,並包括編譯或包裝所需的工具,而運行時環境可以更限制和優化安全性。
  4. 更容易的合規性:較小,更集中的圖像更容易掃描漏洞並確保遵守安全策略,從而更容易維護安全的環境。
  5. 限制秘密暴露:由於敏感數據(例如構建過程中使用的API密鑰)不需要包含在最終圖像中,因此多階段構建可以幫助防止在運行時環境中揭示秘密。

通過利用多階段構建,您可以顯著增強Docker圖像的安全姿勢,同時還可以優化其大小和性能。

以上是如何在Docker中使用多級版本來創建較小,更安全的圖像?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn