Tips
Stage 1: ビルドステージ(ビルドに必要なツールや依存関係をインストール)
Dockerのマルチステージビルドは、ビルド時と実行時で異なる環境を利用することで、最終的なDockerイメージのサイズを大幅に削減し、セキュリティを向上させるテクニックです。開発環境の依存関係やビルドツールを含まない軽量な本番用イメージを作成できます。
技術・言語・ツール: Docker
Dockerのマルチステージビルドは、ビルド時と実行時で異なる環境を利用することで、最終的なDockerイメージのサイズを大幅に削減し、セキュリティを向上させるテクニックです。開発環境の依存関係やビルドツールを含まない軽量な本番用イメージを作成できます。
軽量でセキュアなDockerイメージのためのマルチステージビルド
Dockerイメージをビルドする際、開発に必要なコンパイラやSDK、ビルドツールなどが最終的なイメージに含まれると、イメージサイズが肥大化し、攻撃面も増大します。マルチステージビルドでは、複数のFROM命令を使い、ビルドに必要なステージと、実際にアプリケーションを実行するステージを明確に分離します。前のステージで生成された成果物(実行ファイルやインストールされたライブラリなど)のみを次のステージにコピーすることで、最終イメージを最小限に保ちます。
# Stage 1: ビルドステージ(ビルドに必要なツールや依存関係をインストール)
FROM python:3.9-slim-buster as builder
WORKDIR /app
# 依存関係のインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションコードのコピー
COPY . .
# Stage 2: 実行ステージ(アプリケーションの実行に最小限必要なものだけを含む)
FROM python:3.9-slim-buster
WORKDIR /app
# ビルドステージでインストールされたPythonパッケージをコピー
# アプリケーションによっては `/usr/local/bin` などもコピーする必要がある
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
# ビルドステージからアプリケーションコードをコピー
COPY --from=builder /app .
# アプリケーションのエントリーポイント
CMD ["python", "app.py"]
注意点やおすすめポイント
- イメージサイズの削減: 不要なビルドツールや中間ファイルが最終イメージに含まれないため、ディスク容量の節約とダウンロード時間の短縮に繋がります。
- セキュリティの向上: 攻撃者が利用できるツールやライブラリが最小限に抑えられ、攻撃面が減少します。
- ビルド時間の短縮: キャッシュを効果的に利用できるため、変更が少ないステージは高速にビルドされます。
- Go言語のように静的リンクされるバイナリを生成する言語では、最終ステージを
scratchやalpineのような非常に軽量なベースイメージにすることで、さらなる最適化が可能です。Node.jsやJava、Rubyなどの言語でも同様のテクニックが有効です。