Docker中的多級版本是一項功能,它允許您使用Dockerfile中的FROM
中的多個。每個FROM
都可以啟動構建過程的新階段,您可以將工件從一個階段複製到另一個階段。該方法對於通過將構建環境與運行時環境區分開來創建較小,更安全的Docker圖像特別有用。
這是您可以使用多階段構建來實現這一目標的方法:
定義構建階段:首先定義一個構建階段,在該階段中,您可以編譯應用程序或準備工件。例如,您可以使用golang
圖像來編譯GO應用程序。
<code class="Dockerfile">FROM golang:1.16 as builder WORKDIR /app COPY . . RUN go build -o myapp</code>
定義運行時階段:在構建階段之後,用最小的基本圖像定義運行時階段。僅將構建階段的必要工件複製到此運行時階段。
<code class="Dockerfile">FROM alpine:3.14 COPY --from=builder /app/myapp /myapp CMD ["/myapp"]</code>
通過使用多階段構建,您最終獲得了最終圖像,該圖像僅包含運行您的應用程序所需的內容,該應用程序要小得多,並且與用於構建的圖像相比,它具有更少的潛在漏洞。
在多階段的Docker構建中有效地組織代碼可以大大提高您的Dockerfile的效率和清晰度。以下是一些最佳實踐:
單獨的問題:將不同的階段用於不同的目的(例如,建築物,測試和部署)。這種關注的分離使您的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>
最小化層的數量:在可能的情況下組合運行命令以減少圖像中的層數。這種練習不僅加快了構建過程,而且還使結果圖像較小。
<code class="Dockerfile">RUN apt-get update && \ apt-get install -y some-package && \ rm -rf /var/lib/apt/lists/*</code>
.dockerignore
:創建一個.dockerignore
文件,以排除不必要的文件被複製到Docker構建上下文中。這加快了構建過程並降低圖像大小。package.json
,運行npm install
,然後復制應用程序的其餘部分。在多階段碼頭版中優化緩存可以大大減少構建時間。以下是實現這一目標的幾種策略:
操作順序:將經常更改的命令放在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 . .
命令。
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>
.dockerignore
文件將不必要的文件從構建上下文中排除。較小的上下文意味著更少的數據傳輸和更快的構建。與單級版本相比,多階段的Docker Build提供了一些安全優勢:
通過利用多階段構建,您可以顯著增強Docker圖像的安全姿勢,同時還可以優化其大小和性能。
以上是如何在Docker中使用多級版本來創建較小,更安全的圖像?的詳細內容。更多資訊請關注PHP中文網其他相關文章!