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
を実行してから、アプリケーションの残りの部分をコピーできます。マルチステージDockerビルドでキャッシュを最適化すると、ビルド時間を大幅に短縮できます。これを達成するためのいくつかの戦略があります:
操作の順序: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 . .
指示。
レバレッジビルドキット:Docker BuildKitは、改善されたビルドキャッシュメカニズムを提供します。環境変数を設定してbuildkitを有効にしますDOCKER_BUILDKIT=1
設定し、新しい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ビルドは、単一ステージビルドと比較していくつかのセキュリティ特典を提供します。
マルチステージビルドを活用することにより、Docker画像のセキュリティ姿勢を大幅に強化しながら、サイズとパフォーマンスを最適化できます。
以上がDockerでマルチステージビルドを使用して、より小さく、より安全な画像を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。