containerize-aspnetcore について
ASP.NET Core プロジェクトをコンテナ化するプロンプトベースのスキルです。Linux Docker コンテナのファイルや設定を用意し、マルチステージビルド、依存関係、ヘルスチェック、ビルド検証を扱います。インフラ構築は対象外です。
主な機能
- 01プロジェクト設定に応じたコンテナ構成
- 02マルチステージ Dockerfile の作成
- 03.dockerignore の生成
- 04依存関係と環境変数の処理
- 05任意のヘルスチェック設定
- 06Docker イメージのビルド検証
活用シーン
- 01ASP.NET Core プロジェクト用 Dockerfile の作成
- 02指定した Linux ディストリビューション向けのビルド
- 03ポート、ユーザー、アプリ環境の設定
- 04コンテナイメージのビルド確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ github/ awesome-copilot --skill containerize-aspnetcoreインストール後、Claude Code で/containerize-aspnetcoreを入力して読み込まれたか確認します。
詳細
ASP.NET Core Docker コンテナ化プロンプト
コンテナ化リクエスト
以下の設定で指定された ASP.NET Core (.NET) プロジェクトをコンテナ化してください。アプリケーションが Linux Docker コンテナで実行するために必要な変更にのみ焦点を当ててください。コンテナ化では、ここで指定されたすべての設定を考慮する必要があります。
.NET Core アプリケーションをコンテナ化するためのベストプラクティスに従い、コンテナがパフォーマンス、セキュリティ、保守性の面で最適化されるようにしてください。
コンテナ化設定
プロンプトのこのセクションには、ASP.NET Core アプリケーションをコンテナ化するために必要な特定の設定と構成が含まれています。このプロンプトを実行する前に、設定が必要な情報で入力されていることを確認してください。多くの場合、最初のいくつかの設定のみが必要であることに注意してください。コンテナ化するプロジェクトに当てはまらない場合、後半の設定はデフォルトのままにしておくことができます。
指定されていない設定はすべてデフォルト値に設定されます。デフォルト値は [角括弧] 内に記載されています。
基本的なプロジェクト情報
-
コンテナ化するプロジェクト:
[ProjectName (.csproj ファイルへのパスを指定)]
-
使用する .NET バージョン:
[8.0 または 9.0 (デフォルト 8.0)]
-
使用する Linux ディストリビューション:
[debian、alpine、ubuntu、chiseled、または Azure Linux (mariner) (デフォルト debian)]
-
Docker イメージのビルドステージ用のカスタムベースイメージ (標準の Microsoft ベースイメージを使用する場合は「None」):
[ビルドステージで使用するベースイメージを指定 (デフォルト None)]
-
Docker イメージの実行ステージ用のカスタムベースイメージ (標準の Microsoft ベースイメージを使用する場合は「None」):
[実行ステージで使用するベースイメージを指定 (デフォルト None)]
コンテナ構成
-
コンテナイメージで公開する必要があるポート:
- プライマリ HTTP ポート:
[例: 8080] - 追加ポート:
[追加ポートがあれば列挙、または「None」]
- プライマリ HTTP ポート:
-
コンテナを実行するユーザーアカウント:
[ユーザーアカウント、またはデフォルトの「$APP_UID」]
-
アプリケーション URL 構成:
[ASPNETCORE_URLS を指定、またはデフォルトの「http://+:8080」]
ビルド構成
-
コンテナイメージをビルドする前に実行する必要があるカスタムビルドステップ:
[特定のビルドステップを列挙、または「None」]
-
コンテナイメージをビルドした後に実行する必要があるカスタムビルドステップ:
[特定のビルドステップを列挙、または「None」]
-
構成する必要がある NuGet パッケージソース:
[認証情報を含むプライベート NuGet フィードを列挙、または「None」]
依存関係
-
コンテナイメージにインストールする必要があるシステムパッケージ:
[選択した Linux ディストリビューション用のパッケージ名、または「None」]
-
コンテナイメージにコピーする必要があるネイティブライブラリ:
[ライブラリ名とパス、または「None」]
-
インストールする必要がある追加の .NET ツール:
[ツール名とバージョン、または「None」]
システム構成
- コンテナイメージに設定する必要がある環境変数:
[変数名と値、または「デフォルトを使用」]
ファイルシステム
-
コンテナイメージにコピーする必要があるファイル/ディレクトリ:
[プロジェクトルートからの相対パス、または「None」]- コンテナ内のターゲット場所:
[コンテナパス、または「該当なし」]
-
コンテナ化から除外するファイル/ディレクトリ:
[除外するパス、または「None」]
-
構成する必要があるボリュームマウントポイント:
[永続データ用のボリュームパス、または「None」]
.dockerignore 構成
.dockerignoreファイルに含めるパターン (.dockerignore には既に一般的なデフォルトが含まれています。これらは追加のパターンです):- 追加パターン:
[追加のパターンを列挙、または「None」]
- 追加パターン:
ヘルスチェック構成
-
ヘルスチェックエンドポイント:
[ヘルスチェック URL パス、または「None」]
-
ヘルスチェックの間隔とタイムアウト:
[間隔とタイムアウトの値、または「デフォルトを使用」]
追加の指示
-
プロジェクトをコンテナ化するために従わなければならないその他の指示:
[具体的な要件、または「なし」]
-
対処すべき既知の問題:
[既知の問題を記述するか、「なし」]
スコープ
- ✅ アプリケーション設定と接続文字列を環境変数から読み取れるようにするためのアプリ構成の変更
- ✅ ASP.NET Core アプリケーション用の Dockerfile の作成と構成
- ✅ アプリケーションをビルド/発行し、出力を最終イメージにコピーするための、Dockerfile での複数ステージの指定
- ✅ Linux コンテナプラットフォーム互換性 (Alpine、Ubuntu、Chiseled、または Azure Linux (Mariner)) の構成
- ✅ 依存関係 (システムパッケージ、ネイティブライブラリ、追加ツール) の適切な処理
- ❌ インフラストラクチャのセットアップは行いません (別途対応される想定です)
- ❌ コンテナ化に必要なもの以外のコード変更は行いません
実行プロセス
- 上記のコンテナ化設定を確認し、コンテナ化の要件を理解します
progress.mdファイルを作成し、チェックマークを付けて変更を追跡します- プロジェクトの .csproj ファイルの
TargetFramework要素を確認して .NET バージョンを特定します - 以下に基づいて適切な Linux コンテナイメージを選択します:
- プロジェクトから検出された .NET バージョン
- コンテナ化設定で指定された Linux ディストリビューション (Alpine、Ubuntu、Chiseled、または Azure Linux (Mariner))
- ユーザーがコンテナ化設定で特定のベースイメージを要求していない場合、ベースイメージは、以下の例の Dockerfile またはドキュメントに示されているように、タグ付きの有効な mcr.microsoft.com/dotnet イメージでなければなりません
- ビルドステージとランタイムステージ用の公式 Microsoft .NET イメージ:
- SDK イメージタグ (ビルドステージ用): https://github.com/dotnet/dotnet-docker/blob/main/README.sdk.md
- ASP.NET Core ランタイムイメージタグ: https://github.com/dotnet/dotnet-docker/blob/main/README.aspnet.md
- .NET ランタイムイメージタグ: https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md
- アプリケーションをコンテナ化するために、プロジェクトディレクトリのルートに Dockerfile を作成します
- Dockerfile は複数のステージを使用する必要があります:
- ビルドステージ: .NET SDK イメージを使用してアプリケーションをビルドします
- 最初に csproj ファイルをコピーします
- NuGet.config が存在する場合はコピーし、プライベートフィードを構成します
- NuGet パッケージを復元します
- その後、残りのソースコードをコピーし、アプリケーションをビルドして /app/publish に発行します
- 最終ステージ: 選択した .NET ランタイムイメージを使用してアプリケーションを実行します
- 作業ディレクトリを /app に設定します
- 指示に従ってユーザーを設定します (デフォルトでは、非 root ユーザー (例:
$APP_UID) に設定します)- コンテナ化設定で別途指示がない限り、新しいユーザーを作成する必要はありません。
$APP_UID変数を使用してユーザーアカウントを指定します。
- コンテナ化設定で別途指示がない限り、新しいユーザーを作成する必要はありません。
- ビルドステージで発行された出力を最終イメージにコピーします
- ビルドステージ: .NET SDK イメージを使用してアプリケーションをビルドします
- コンテナ化設定のすべての要件を必ず考慮してください:
- .NET バージョンと Linux ディストリビューション
- 公開ポート
- コンテナのユーザーアカウント
- ASPNETCORE_URLS 構成
- システムパッケージのインストール
- ネイティブライブラリの依存関係
- 追加の .NET ツール
- 環境変数
- ファイル/ディレクトリのコピー
- ボリュームマウントポイント
- ヘルスチェック構成
- Dockerfile は複数のステージを使用する必要があります:
- 不要なファイルを Docker イメージから除外するために、プロジェクトディレクトリのルートに
.dockerignoreファイルを作成します。.dockerignoreファイルには、少なくとも以下の要素と、コンテナ化設定で指定された追加のパターンを含める必要があります:- bin/
- obj/
- .dockerignore
- Dockerfile
- .git/
- .github/
- .vs/
- .vscode/
- **/node_modules/
- *.user
- *.suo
- **/.DS_Store
- **/Thumbs.db
- コンテナ化設定で指定された追加のパターン
- コンテナ化設定で指定されている場合はヘルスチェックを構成します:
- ヘルスチェックエンドポイントが提供されている場合は、Dockerfile に HEALTHCHECK 命令を追加します
- curl または wget を使用してヘルスエンドポイントをチェックします
- タスクを完了としてマークします: [ ] → [✓]
- すべてのタスクが完了し、Docker ビルドが成功するまで続けます
ビルドとランタイムの検証
Dockerfile が完成したら、Docker ビルドが成功することを確認します。以下のコマンドを使用して Docker イメージをビルドします:
docker build -t aspnetcore-app:latest .
ビルドが失敗した場合は、エラーメッセージを確認し、Dockerfile またはプロジェクト構成に必要な調整を加えます。成功/失敗を報告します。
進捗の追跡
以下の構造を持つ progress.md ファイルを維持してください:
# Containerization Progress
## Environment Detection
- [ ] .NET version detection (version: ___)
- [ ] Linux distribution selection (distribution: ___)
## Configuration Changes
- [ ] Application configuration verification for environment variable support
- [ ] NuGet package source configuration (if applicable)
## Containerization
- [ ] Dockerfile creation
- [ ] .dockerignore file creation
- [ ] Build stage created with SDK image
- [ ] csproj file(s) copied for package restore
- [ ] NuGet.config copied if applicable
- [ ] Runtime stage created with runtime image
- [ ] Non-root user configuration
- [ ] Dependency handling (system packages, native libraries, tools, etc.)
- [ ] Health check configuration (if applicable)
- [ ] Special requirements implementation
## Verification
- [ ] Review containerization settings and make sure that all requirements are met
- [ ] Docker build success
手順間で確認のために一時停止しないでください。アプリケーションがコンテナ化され、Docker ビルドが成功するまで、体系的に続けてください。
すべてのチェックボックスがチェックされるまで、あなたは完了していません! これには、Docker イメージのビルドを正常に完了すること、およびビルドプロセス中に発生するあらゆる問題に対処することが含まれます。
Dockerfile の例
Linux ベースイメージを使用する ASP.NET Core (.NET) アプリケーション用の Dockerfile の例です。
# ============================================================
# Stage 1: Build and publish the application
# ============================================================
# Base Image - Select the appropriate .NET SDK version and Linux distribution
# Possible tags include:
# - 8.0-bookworm-slim (Debian 12)
# - 8.0-noble (Ubuntu 24.04)
# - 8.0-alpine (Alpine Linux)
# - 9.0-bookworm-slim (Debian 12)
# - 9.0-noble (Ubuntu 24.04)
# - 9.0-alpine (Alpine Linux)
# Uses the .NET SDK image for building the application
FROM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
# Copy project files first for better caching
COPY ["YourProject/YourProject.csproj", "YourProject/"]
COPY ["YourOtherProject/YourOtherProject.csproj", "YourOtherProject/"]
# Copy NuGet configuration if it exists
COPY ["NuGet.config", "."]
# Restore NuGet packages
RUN dotnet restore "YourProject/YourProject.csproj"
# Copy source code
COPY . .
# Perform custom pre-build steps here, if needed
# RUN echo "Running pre-build steps..."
# Build and publish the application
WORKDIR "/src/YourProject"
RUN dotnet build "YourProject.csproj" -c $BUILD_CONFIGURATION -o /app/build
# Publish the application
RUN dotnet publish "YourProject.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
# Perform custom post-build steps here, if needed
# RUN echo "Running post-build steps..."
# ============================================================
# Stage 2: Final runtime image
# ============================================================
# Base Image - Select the appropriate .NET runtime version and Linux distribution
# Possible tags include:
# - 8.0-bookworm-slim (Debian 12)
# - 8.0-noble (Ubuntu 24.04)
# - 8.0-alpine (Alpine Linux)
# - 8.0-noble-chiseled (Ubuntu 24.04 Chiseled)
# - 8.0-azurelinux3.0 (Azure Linux)
# - 9.0-bookworm-slim (Debian 12)
# - 9.0-noble (Ubuntu 24.04)
# - 9.0-alpine (Alpine Linux)
# - 9.0-noble-chiseled (Ubuntu 24.04 Chiseled)
# - 9.0-azurelinux3.0 (Azure Linux)
# Uses the .NET runtime image for running the application
FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim AS final
# Install system packages if needed (uncomment and modify as needed)
# RUN apt-get update && apt-get install -y \
# curl \
# wget \
# ca-certificates \
# libgdiplus \
# && rm -rf /var/lib/apt/lists/*
# Install additional .NET tools if needed (uncomment and modify as needed)
# RUN dotnet tool install --global dotnet-ef --version 8.0.0
# ENV PATH="$PATH:/root/.dotnet/tools"
WORKDIR /app
# Copy published application from build stage
COPY --from=build /app/publish .
# Copy additional files if needed (uncomment and modify as needed)
# COPY ./config/appsettings.Production.json .
# COPY ./certificates/ ./certificates/
# Set environment variables
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS=http://+:8080
# Add custom environment variables if needed (uncomment and modify as needed)
# ENV CONNECTIONSTRINGS__DEFAULTCONNECTION="your-connection-string"
# ENV FEATURE_FLAG_ENABLED=true
# Configure SSL/TLS certificates if needed (uncomment and modify as needed)
# ENV ASPNETCORE_Kestrel__Certificates__Default__Path=/app/certificates/app.pfx
# ENV ASPNETCORE_Kestrel__Certificates__Default__Password=your_password
# Expose the port the application listens on
EXPOSE 8080
# EXPOSE 8081 # Uncomment if using HTTPS
# Install curl for health checks if not already present
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
# Configure health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
# Create volumes for persistent data if needed (uncomment and modify as needed)
# VOLUME ["/app/data", "/app/logs"]
# Switch to non-root user for security
USER $APP_UID
# Set the entry point for the application
ENTRYPOINT ["dotnet", "YourProject.dll"]
この例の適応
注記: コンテナ化設定の具体的な要件に基づいて、このテンプレートをカスタマイズしてください。
この Dockerfile の例を適応する際は、以下の点に注意してください:
YourProject.csproj、YourProject.dllなどを実際のプロジェクト名に置き換えます- 必要に応じて .NET のバージョンと Linux ディストリビューションを調整します
- 要件に基づいて依存関係のインストール手順を変更し、不要なものを削除します
- アプリケーション固有の環境変数を設定します
- 特定のワークフローに応じてステージを追加または削除します
- ヘルスチェックのエンドポイントを、アプリケーションのヘルスチェックルートに合わせて更新します
Linux ディストリビューションのバリエーション
Alpine Linux
より小さなイメージサイズを実現するには、Alpine Linux を使用できます:
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
# ... build steps ...
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS final
# Install packages using apk
RUN apk update && apk add --no-cache curl ca-certificates
Ubuntu Chiseled
攻撃対象領域を最小限に抑えるには、chiseled イメージの使用を検討してください:
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy-chiseled AS final
# Note: Chiseled images have minimal packages, so you may need to use a different base for additional dependencies
Azure Linux (Mariner)
Azure に最適化されたコンテナには:
FROM mcr.microsoft.com/dotnet/aspnet:8.0-azurelinux3.0 AS final
# Install packages using tdnf
RUN tdnf update -y && tdnf install -y curl ca-certificates && tdnf clean all
ステージ命名に関する注記
AS stage-name構文は各ステージに名前を付けます- 前のステージからファイルをコピーするには
--from=stage-nameを使用します - 最終イメージで使用されない複数の中間ステージを持つことができます
finalステージは、最終的なコンテナイメージになるステージです
セキュリティのベストプラクティス
- 本番環境では常に非 root ユーザーとして実行してください
latestではなく特定のイメージタグを使用してください- インストールするパッケージの数を最小限に抑えてください
- ベースイメージを最新の状態に保ってください
- マルチステージビルドを使用して、ビルド依存関係を最終イメージから除外してください