Dockerfile
作成日:
Docker container infrastructure Dockerfile
Dockerイメージを構築するための設定ファイル。Dockerfileを使用して、アプリケーションの実行環境を定義します。
マルチステージビルド
マルチステージビルドとは
1つのDockerfile内で複数のビルドステージを定義し、最終的なイメージを軽量化する手法。
典型的な構成(静的サイトジェネレーターの場合)
# ステージ1: ビルドステージ(Node.jsが必要)
FROM node:24-alpine AS builder
WORKDIR /app
# 依存関係のインストール
COPY package*.json ./
RUN npm ci
# ソースコードのコピー
COPY . .
# ビルド(静的ファイルを生成)
RUN npm run build
# ステージ2: 実行ステージ(Node.jsは不要)
FROM nginx:alpine
# ビルド済みの静的ファイルをコピー
COPY --from=builder /app/dist /usr/share/nginx/html
# Nginx設定
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
なぜ2番目のステージでNode.jsが不要なのか
重要なポイント:
-
ビルドは完了している
- 1番目のステージ(
builder)でnpm run buildを実行し、静的ファイル(HTML、CSS、JS)をdist/ディレクトリに生成済み - 2番目のステージでは、このビルド済みファイルをコピーするだけ
- 1番目のステージ(
-
静的ファイルのみを配信
- Astroなどの静的サイトジェネレーターは、ビルド時にすべてのページをHTMLに変換
- 実行時にはサーバーサイド処理が不要(Node.jsランタイム不要)
- Nginxは静的ファイルを配信するだけのWebサーバー
-
イメージサイズの最適化
- Node.jsを含めないことで、最終イメージが大幅に軽量化される
node:24-alpineは約200MB、nginx:alpineは約40MB- 約160MBの削減効果
-
セキュリティ面のメリット
- Node.jsを含めないことで、攻撃面が減る
- 必要最小限のコンポーネントのみを含める
マルチステージビルドの利点まとめ
- 軽量化: 最終イメージにビルドツールを含めない
- セキュリティ: 不要なコンポーネントを除外
- パフォーマンス: 軽量なイメージで起動が速い
- 明確な分離: ビルド環境と実行環境を分離
実際の使用例
# ビルド(マルチステージビルド)
docker build -t myapp:latest .
# 実行(Nginxのみで動作)
docker run -p 8080:80 myapp:latest
# イメージサイズの確認
docker images myapp:latest
# → Node.jsを含まない軽量なイメージ
関連トピック
- Docker - Dockerの基本概念
- Astro Docker - AstroプロジェクトのDocker化