dotnet-dockerfile について
.NET Dockerfile Generatorは、.NETアプリケーション向けのマルチステージDockerfileを生成するスキルです。.NETのバージョンとアプリケーションの種類に応じて、chiseledイメージやNative AOTなどのイメージとデプロイ方式を選べます。
主な機能
- 01.NETのバージョンとアプリケーション種別を特定
- 02標準、chiseled、Native AOTの方式を選択
- 03複数プロジェクトのソリューション向け構成を生成
- 04自己完結型デプロイの指針を提示
- 05キャッシュ、ダイジェスト固定、検証の指針を提示
活用シーン
- 01ASP.NET Coreアプリ用Dockerfileの作成
- 02複数プロジェクトの.NETソリューションのコンテナ化
- 03Native AOT公開用イメージの選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jkappers/ agent-skills --skill dotnet-dockerfileインストール後、Claude Code で/dotnet-dockerfileを入力して読み込まれたか確認します。
詳細
.NET Dockerfile ジェネレーター
.NET アプリケーション向けに、本番環境に対応したマルチステージ Dockerfile を生成します。
ワークフロー
- プロジェクトファイルから .NET のバージョン(8、9、または 10)を特定するか、ユーザーに確認します
- プロジェクトの種類を特定します:ASP.NET Core Web アプリ、API、ワーカーサービス、またはコンソールアプリ
- プロジェクトファイルのパスを確認します(例:
src/MyApp/MyApp.csproj) - 最適化方法を選択します:標準、chiseled(より小さい)、または native AOT(最小/起動が最速)
.NET 10 の破壊的変更:Ubuntu がすべての .NET コンテナーイメージのデフォルトの Linux ディストリビューションになりました。Debian イメージは提供されなくなりました。
10.0、10.0-noble、10.0-noble-chiseledなどのタグは、すべて Ubuntu 24.04「Noble Numbat」を使用します。
イメージ選択ガイド
| シナリオ | ランタイムイメージ | 圧縮後のサイズ |
|---|---|---|
| 標準的な ASP.NET | aspnet:10.0 | 約 92 MB |
| フットプリントを縮小 | aspnet:10.0-alpine | 約 52 MB |
| 本番環境(推奨) | aspnet:10.0-noble-chiseled | 約 53 MB |
| Azure Linux distroless | aspnet:10.0-azurelinux3.0-distroless | 約 55 MB |
| 自己完結型 | runtime-deps:10.0-noble-chiseled | 約 22 MB |
| Native AOT | runtime-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-aotmcr.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 ピン留めを検討する