mcpField
D
dotnet-dockerfile

dotnet-dockerfile

github.com/jkappersクラウド・DevOps045 回インストール36 週間前に更新
リポジトリ

dotnet-dockerfile について

.NET Dockerfile Generatorは、.NETアプリケーション向けのマルチステージDockerfileを生成するスキルです。.NETのバージョンとアプリケーションの種類に応じて、chiseledイメージやNative AOTなどのイメージとデプロイ方式を選べます。

主な機能

  1. 01.NETのバージョンとアプリケーション種別を特定
  2. 02標準、chiseled、Native AOTの方式を選択
  3. 03複数プロジェクトのソリューション向け構成を生成
  4. 04自己完結型デプロイの指針を提示
  5. 05キャッシュ、ダイジェスト固定、検証の指針を提示

活用シーン

  1. 01ASP.NET Coreアプリ用Dockerfileの作成
  2. 02複数プロジェクトの.NETソリューションのコンテナ化
  3. 03Native AOT公開用イメージの選択

インストール

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

$npx skills add https://github.com/jkappers/agent-skills --skill dotnet-dockerfile

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

詳細

.NET Dockerfile ジェネレーター

.NET アプリケーション向けに、本番環境に対応したマルチステージ Dockerfile を生成します。

ワークフロー

  1. プロジェクトファイルから .NET のバージョン(8、9、または 10)を特定するか、ユーザーに確認します
  2. プロジェクトの種類を特定します:ASP.NET Core Web アプリ、API、ワーカーサービス、またはコンソールアプリ
  3. プロジェクトファイルのパスを確認します(例:src/MyApp/MyApp.csproj)
  4. 最適化方法を選択します:標準、chiseled(より小さい)、または native AOT(最小/起動が最速)

.NET 10 の破壊的変更:Ubuntu がすべての .NET コンテナーイメージのデフォルトの Linux ディストリビューションになりました。Debian イメージは提供されなくなりました。10.0、10.0-noble、10.0-noble-chiseled などのタグは、すべて Ubuntu 24.04「Noble Numbat」を使用します。

イメージ選択ガイド

シナリオランタイムイメージ圧縮後のサイズ
標準的な ASP.NETaspnet:10.0約 92 MB
フットプリントを縮小aspnet:10.0-alpine約 52 MB
本番環境(推奨)aspnet:10.0-noble-chiseled約 53 MB
Azure Linux distrolessaspnet:10.0-azurelinux3.0-distroless約 55 MB
自己完結型runtime-deps:10.0-noble-chiseled約 22 MB
Native AOTruntime-deps:10.0-noble-chiseled約 12 MB

Chiseled イメージ:Ubuntu ベースで、シェルとパッケージマネージャーがなく、デフォルトで非 root ユーザーとして実行されます。本番環境におすすめです。

Azure Linux distroless:Microsoft のサプライチェーンセキュリティを備えた、chiseled の代替イメージです。同様に、シェルがなく、デフォルトで非 root ユーザーとして実行されます。

標準パターン

# syntax=docker/dockerfile:1

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src

# Copy project files and restore (cache layer)
COPY *.csproj ./
RUN dotnet restore

# Copy source and publish
COPY . .
RUN dotnet publish -c Release -o /app/publish

# Runtime
FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-chiseled AS production
WORKDIR /app
COPY --from=build /app/publish .
USER app
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApp.dll"]

マルチプロジェクトソリューションのパターン

複数のプロジェクトを含むソリューションでは、最初にすべての .csproj ファイルをコピーします。

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src

# Copy solution and project files (cache layer)
COPY *.sln ./
COPY src/MyApp/*.csproj ./src/MyApp/
COPY src/MyApp.Core/*.csproj ./src/MyApp.Core/
COPY tests/MyApp.Tests/*.csproj ./tests/MyApp.Tests/
RUN dotnet restore

# Copy everything and publish
COPY . .
RUN dotnet publish src/MyApp -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-chiseled AS production
WORKDIR /app
COPY --from=build /app/publish .
USER app
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApp.dll"]

自己完結型デプロイ

.NET ランタイムをアプリにバンドルすることで、最小サイズの runtime-deps イメージを使用できます。

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY *.csproj ./
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish \
    --self-contained true \
    -r linux-x64

FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-noble-chiseled AS production
WORKDIR /app
COPY --from=build /app/publish .
USER app
EXPOSE 8080
ENTRYPOINT ["./MyApp"]

Native AOT(最速の起動)

ネイティブコードにコンパイルします。最小サイズのイメージ(約 12 MB)で、起動も最速です。

FROM mcr.microsoft.com/dotnet/sdk:10.0-aot AS build
WORKDIR /src
COPY *.csproj ./
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-noble-chiseled AS production
WORKDIR /app
COPY --from=build /app/publish .
USER app
EXPOSE 8080
ENTRYPOINT ["./MyApp"]

AOT 専用 SDK イメージには、ネイティブコンパイルの前提条件が含まれています。

  • mcr.microsoft.com/dotnet/sdk:10.0-aot(Ubuntu。10.0-noble-aot というタグもあります)
  • mcr.microsoft.com/dotnet/sdk:10.0-alpine-aot
  • mcr.microsoft.com/dotnet/sdk:10.0-azurelinux3.0-aot

.csproj で必要な設定:

<PropertyGroup>
  <PublishAot>true</PublishAot>
</PropertyGroup>

制限事項:実行時リフレクションは使用できず、すべてのライブラリに互換性があるわけではありません。

Dockerfile を使わないコンテナーの発行

.NET 10 では、Dockerfile を使わずに SDK からコンテナーを直接発行できます。

# Publish to local container runtime
dotnet publish --os linux --arch x64 /t:PublishContainer

# Publish directly to a registry (no Docker needed)
dotnet publish --os linux --arch x64 /t:PublishContainer \
    -p ContainerRegistry=ghcr.io \
    -p ContainerRepository=myorg/myapp

# Multi-architecture publishing
dotnet publish /t:PublishContainer \
    -p ContainerRuntimeIdentifiers="linux-x64;linux-arm64"

プロジェクトファイルの設定:

<PropertyGroup>
  
  <ContainerImageFormat>OCI</ContainerImageFormat>
  
  <ContainerBaseImage>mcr.microsoft.com/dotnet/aspnet:10.0-noble-chiseled</ContainerBaseImage>
  
  <ContainerRepository>myapp</ContainerRepository>
  <ContainerImageTag>1.0.0</ContainerImageTag>
</PropertyGroup>

開発ステージ

ホットリロードを使ったローカル開発向けに、開発ステージを追加します。

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS base
WORKDIR /src
COPY *.csproj ./
RUN dotnet restore

FROM base AS development
COPY . .
ENTRYPOINT ["dotnet", "watch", "run"]

FROM base AS build
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-chiseled AS production
WORKDIR /app
COPY --from=build /app/publish .
USER app
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApp.dll"]

開発用ビルド:docker build --target development -t myapp:dev .

キャッシュの最適化

NuGet パッケージに BuildKit のキャッシュマウントを使用します。

RUN --mount=type=cache,target=/root/.nuget/packages \
    dotnet restore

本番環境向け SHA ピン留め

再現性とセキュリティを確保するため、イメージのダイジェストを正確に指定します。

FROM mcr.microsoft.com/dotnet/sdk:10.0@sha256:abc123... AS build

現在のダイジェストを確認するには、次を実行します。

docker pull mcr.microsoft.com/dotnet/sdk:10.0
docker inspect --format='{{index .RepoDigests 0}}' mcr.microsoft.com/dotnet/sdk:10.0

必須の .dockerignore

必ず .dockerignore を作成します。

**/bin/
**/obj/
**/.vs/
**/.vscode/
**/node_modules/
**/*.user
**/*.userosscache
**/*.suo
*.md
.git
.gitignore
Dockerfile*
docker-compose*

検証チェックリスト

  • ビルドステージには SDK イメージ、本番環境には runtime/aspnet イメージを使用する
  • .NET 8 以降ではポート 8080 を使用する(80 ではありません)
  • キャッシュ効率を高めるため、ソースより先に .csproj ファイルをコピーする
  • root 以外のユーザーで実行するため、USER app を使用する(chiseled イメージにはこのユーザーがあります)
  • chiseled イメージにはシェルがありません。exec 形式のみを使用し、最終ステージで && による連結を行わない
  • ビルド成果物を除外するため、.dockerignore を含める
  • 自己完結型ビルドではランタイム識別子(-r linux-x64)を一致させる
  • 本番環境での再現性を高めるため、SHA ピン留めを検討する

コメント