mcpField
C
container-native-deployment

container-native-deployment

github.com/rrezartprebrezaクラウド・DevOps32843 回インストール6 日前に更新
リポジトリ

container-native-deployment について

Spring Boot サービス向けのデプロイ用スキルです。起動時間、メモリ、スループット、ビルド制約を基に JVM とネイティブイメージを比較し、コンテナ構築からテスト、サプライチェーン確認まで扱います。

主な機能

  1. 01JVM とネイティブの制約比較
  2. 02Buildpacks によるレイヤーイメージ構築
  3. 03プローブとコンテナ制限の設定
  4. 04GraalVM RuntimeHints の追加
  5. 05SBOM とイメージのセキュリティ確認

活用シーン

  1. 01ベンチマークに基づくデプロイ方式の選択
  2. 02再現可能な Spring Boot イメージのリリース
  3. 03実行時のみのシークレット注入によるコンテナ強化
  4. 04JVM テストとは別のネイティブビルド検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/rrezartprebreza/spring-boot-skills --skill container-native-deployment

インストール後、Claude Code で/container-native-deploymentを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
examples/
bad-dockerfile
good-dockerfile

詳細

コンテナーとネイティブのデプロイ

計測した起動時間、メモリ使用量、スループット、ビルド上の制約に基づいて、JVM とネイティブのどちらを使うか選択します。

コンテナーイメージ

  • 標準的なサービスでは、Cloud Native Buildpacks を使う Spring Boot の build-image タスクを優先します。
  • キャッシュを最大限再利用できるよう、依存関係のレイヤーとアプリケーションのレイヤーを分けます。
  • 再現可能なリリースパイプラインでは、ビルダーと実行イメージの系列を固定します。
  • アプリケーションで許可される場合は、読み取り専用ファイルシステム上で非 root ユーザーとして実行します。
  • シークレットは実行時に渡します。認証情報や環境ファイルをイメージに組み込んではいけません。
  • グレースフルシャットダウンを設定し、プラットフォームの終了猶予時間をアプリケーションのタイムアウトに合わせます。

実行時の動作

  • メモリと CPU の上限を設定し、その範囲内で JVM のエルゴノミクスが適切に機能することを確認します。
  • Actuator を通じて、専用のレディネスプローブとライブネスプローブを公開します。
  • ライブネスプローブを弱めるのではなく、初期化に時間がかかる場合はスタートアッププローブを使います。
  • 一時ファイルの書き込み先は、明示的に指定した書き込み可能な場所だけにします。

ネイティブイメージ

  • Spring AOT と、サポート対象の GraalVM ネイティブビルドツールを使用します。
  • 解析で推論できないリフレクション、リソース、シリアライゼーション、プロキシについては、RuntimeHints を追加します。
  • 実行時の Bean 構成変更など、クローズドワールドの制約に違反する動作は避けます。
  • ネイティブの統合テストを実行します。JVM テストスイートが成功しただけでは不十分です。

サプライチェーン

  • SBOM を生成し、最終イメージをスキャンして、ビルダーイメージと実行イメージに定期的にパッチを適用します。
  • 環境間で昇格させる際は、変更されないイメージダイジェストを使用します。

例

  • examples/good-dockerfile と examples/bad-dockerfile を参照してください。

良い例は Boot 3.3 以降を対象としており、ビルダーステージで jarmode=tools による展開を使用します。Boot 3.0-3.2 では、従来の -Djarmode=layertools ... extract コマンドを使用してください。通常の Maven パッケージ作成だけでは、 target/dependencies/ や target/application/ ディレクトリは作成されません。

公式ソース

注意点

  • エージェントが、肥大化した単一の JAR を変更可能な root コンテナーにコピーする場合は、レイヤーと非 root の実行環境を使用します。
  • エージェントがシークレットをイメージレイヤーに組み込む場合は、実行時にのみシークレットを注入します。
  • エージェントがネイティブビルドを成功させるために広範なリフレクション設定を追加する場合は、対象を絞った実行時ヒントを登録します。
  • エージェントがすべての依存関係をテストするためにライブネスを使う場合は、トラフィックに影響する依存関係の確認にレディネスを使用します。
  • エージェントがスループットやビルドコストを計測せずにネイティブを選ぶ場合は、両方のデプロイモードをベンチマークします。
  • エージェントが存在しない target/dependencies ディレクトリをコピーする場合は、ビルダーステージでパッケージ済みの JAR を展開します。
  • エージェントが Boot 3.0-3.2 で jarmode=tools を使う場合は、プロジェクトが Boot 3.3 に到達するまで layertools を使用します。

コメント