multi-stage-dockerfile について
マルチステージ Dockerfile の作成を支援し、イメージサイズ、ビルド効率、安全性に関する指針を示すスキルです。アプリケーションをコンテナ化する開発者向けです。
主な機能
- 01ビルド段階と実行段階を分離
- 02最小限でバージョン固定のベースイメージを推奨
- 03キャッシュ再利用を考慮したレイヤー構成
- 04最終イメージの内容を最小化
- 05非 root ユーザーと権限設定
- 06イメージスキャンとヘルスチェック
活用シーン
- 01より小さな実行イメージの作成
- 02Docker ビルドキャッシュの再利用改善
- 03コンテナ内の不要なパッケージ削減
- 04コンテナビルドへのセキュリティ対策適用
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ github/ awesome-copilot --skill multi-stage-dockerfileインストール後、Claude Code で/multi-stage-dockerfileを入力して読み込まれたか確認します。
詳細
あなたの目標は、ベストプラクティスに従った効率的なマルチステージ Dockerfile を作成し、より小さく安全なコンテナイメージを実現することを支援することです。
マルチステージ構造
- コンパイル、依存関係のインストール、その他のビルド時操作にはビルダーステージを使用します
- アプリケーションの実行に必要なものだけを含む、独立したランタイムステージを使用します
- ビルダーステージからランタイムステージへは必要な成果物のみをコピーします
ASキーワードを使って意味のあるステージ名を付けます(例:FROM node:18 AS builder)- ステージは論理的な順序で配置します: 依存関係 → ビルド → テスト → ランタイム
ベースイメージ
- 可能な限り、公式の最小限のベースイメージから始めます
- 再現可能なビルドを確保するために、正確なバージョンタグを指定します(例:
pythonだけでなくpython:3.11-slim) - 適切な場合は、ランタイムステージに distroless イメージの使用を検討します
- アプリケーションと互換性がある場合は、より小さなフットプリントのために Alpine ベースのイメージを使用します
- ランタイムイメージに必要最小限の依存関係があることを確認します
レイヤーの最適化
- レイヤーのキャッシュを最大化するようにコマンドを整理します
- 頻繁に変更されるコマンド(コード変更など)は、変更頻度の低いコマンド(依存関係のインストールなど)の後に配置します
.dockerignoreを使用して、不要なファイルがビルドコンテキストに含まれないようにします- 関連する RUN コマンドを
&&で結合してレイヤー数を削減します - COPY --chown を使用して 1 ステップで権限を設定することを検討します
セキュリティの実践
- コンテナを root で実行することは避けます -
USER命令を使用して非 root ユーザーを指定します - 最終イメージからビルドツールや不要なパッケージを削除します
- 最終イメージの脆弱性をスキャンします
- 制限の厳しいファイル権限を設定します
- マルチステージビルドを使用して、ビルドシークレットが最終イメージに含まれないようにします
パフォーマンスに関する考慮事項
- 環境間で変更される可能性のある設定にはビルド引数を使用します
- レイヤーを変更頻度の低いものから高いものへと並べることで、ビルドキャッシュを効率的に活用します
- 可能な場合はビルドステップの並列化を検討します
- ランタイムの動作を最適化するために、NODE_ENV=production のような適切な環境変数を設定します
- HEALTHCHECK 命令を使用して、アプリケーションの種類に適したヘルスチェックを設定します
コメント
Markdown 対応