ホームページ >運用・保守 >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ビルドでコードを整理するためのベストプラクティスは何ですか?

マルチステージ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ビルドのキャッシュを最適化するにはどうすればよいですか?

マルチステージ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. レバレッジビルドキット: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>
  4. Dockerビルドコンテキストを最小化します。.Dockerignoreファイル.dockerignore使用して、ビルドコンテキストから不要なファイルを除外します。コンテキストが小さいとは、転送するデータが少なくなり、ビルドが速くなります。
  5. 特定のベース画像を使用します。軽量で安定したベース画像を使用して、ビルド中にベースレイヤーを引くのにかかる時間を短縮します。

単一段階のビルドと比較して、マルチステージDockerビルドが提供するセキュリティ利点は何ですか?

マルチステージのDockerビルドは、単一ステージビルドと比較していくつかのセキュリティ特典を提供します。

  1. 画像サイズが小さい:ビルドステージからランタイムステージまで必要なアーティファクトのみをコピーすることにより、マルチステージビルドにより、最終画像がはるかに小さくなります。脆弱なコンポーネントが少ないため、小さい画像には攻撃面が縮小されています。
  2. 脆弱性の低下:最終画像には、ビルドプロセス中にのみ必要なビルドツールまたは依存関係が含まれていないため、攻撃者がこれらのツールの脆弱性を活用する機会は少なくなります。
  3. ビルドおよびランタイム環境の分離:マルチステージビルドを使用すると、アプリケーションの構築と実行に異なるベース画像を使用できます。ビルド環境はより寛容であり、コンパイルまたはパッケージングに必要なツールを含めることができますが、ランタイム環境はより制限され、セキュリティのために最適化できます。
  4. コンプライアンスの容易:より小さく、より焦点を絞った画像は、脆弱性をスキャンし、セキュリティポリシーのコンプライアンスを確保し、安全な環境を維持しやすくなります。
  5. 秘密の露出の制限:機密データ(ビルド中に使用されるAPIキーなど)を最終画像に含める必要はないため、マルチステージビルドは、ランタイム環境で秘密が公開されるのを防ぐのに役立ちます。

マルチステージビルドを活用することにより、Docker画像のセキュリティ姿勢を大幅に強化しながら、サイズとパフォーマンスを最適化できます。

以上がDockerでマルチステージビルドを使用して、より小さく、より安全な画像を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。