コンテナ - .NET

提供: MochiuWiki : SUSE, EC, PCB

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要

.NETコンテナには主に2つのタイプがある。

  • .NETランタイムイメージ
    アプリケーションの実行専用で、必要最小限の軽量なイメージである。
  • .NET SDKイメージ
    開発やビルドに必要なツールを含む大きなイメージである。


実運用環境では、まずSDKイメージでアプリケーションをビルドして、その成果物をランタイムイメージにコピーする マルチステージビルド という手法が一般的である。

用途に応じて適切なベースイメージを選択することにより、効率的で安全なコンテナイメージを作成することができる。


.NETランタイム向けのコンテナファイル

ビルド済みのアプリケーションを実行するためのランタイムイメージを以下に示す。

このランタイムイメージは、.NET / ASP.NET Coreアプリケーションを実行するために必要な最小限のコンポーネントのみを含んでいる。
イメージサイズが小さく、セキュリティ面でも攻撃対象が少ないというメリットがある。

 # .NET 8のランタイムイメージを使用
 ## 非ASP.NET Core向け
 FROM mcr.microsoft.com/dotnet/runtime:8.0 AS final
 
 ## ASP.NET Core向け
 # FROM mcr.microsoft.com/dotnet/aspnet:8.0 
 
 # 作業ディレクトリを設定
 WORKDIR /app
 
 # ビルド済みのアプリケーションファイルをコピー
 # このファイルは事前にローカルでビルドする必要がある
 COPY ./publish /app
 
 # アプリケーションが使用するポートを公開
 EXPOSE 8080
 
 # アプリケーションを起動
 ENTRYPOINT ["dotnet", "YourApp.dll"]



.NET SDK向けのコンテナファイル

開発環境やコンテナ内でビルドを行う場合は、.NET SDKイメージを使用する。

.NET SDKイメージにはコンパイラや開発ツールが含まれているため、ソースコードから直接アプリケーションをビルドすることができる。
ただし、イメージサイズは大きくなる。

 # .NET 8のSDKイメージを使用
 FROM mcr.microsoft.com/dotnet/sdk:8.0
 
 # 作業ディレクトリを設定
 WORKDIR /src
 
 # プロジェクトファイルをコピーして依存関係を復元
 # この段階的なコピーにより、依存関係のキャッシュが効率的になる
 COPY ["YourApp.csproj", "./"]
 RUN dotnet restore "YourApp.csproj"
 
 # ソースコードをコピー
 COPY . .
 
 # アプリケーションをビルド
 RUN dotnet build "YourApp.csproj" -c Release -o /app/build
 
 # アプリケーションを実行
 WORKDIR /app/build
 ENTRYPOINT ["dotnet", "YourApp.dll"]



マルチステージビルド (推奨)

実運用環境では、ビルドと実行を分離したマルチステージビルドが最も推奨される。
これにより、最終イメージを小さく保ちながら、コンテナ内でのビルドすることができる。

マルチステージビルドでは、最初に.NET SDKイメージでアプリケーションをビルドして、最終的にはランタイムイメージに必要なファイルのみをコピーする。
これにより、最終イメージから.NET SDKやビルドツールが除外されて、サイズとセキュリティの両面で最適化される。

 # ビルドステージ
 # .NET SDKイメージを使用してアプリケーションをビルド
 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
 WORKDIR /src
 
 # プロジェクトファイルをコピーして依存関係を復元
 # この段階を分けることにより、ソースコードが変更されても依存関係のレイヤーはキャッシュされる
 COPY ["YourApp/YourApp.csproj", "YourApp/"]
 RUN dotnet restore "YourApp/YourApp.csproj"
 
 # ソースコードをコピーしてビルド
 COPY . .
 WORKDIR "/src/YourApp"
 RUN dotnet build "YourApp.csproj" -c Release -o /app/build
 
 # パブリッシュステージ
 # ビルド成果物を発行形式に変換
 FROM build AS publish
 RUN dotnet publish "YourApp.csproj" -c Release -o /app/publish /p:UseAppHost=false
 
 # 実行ステージ
 # 軽量なランタイムイメージに切り替え
 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
 WORKDIR /app
 
 # パブリッシュステージから成果物だけをコピー
 COPY --from=publish /app/publish .
 
 # ポートを公開
 EXPOSE 8080
 
 # アプリケーションを起動
 ENTRYPOINT ["dotnet", "YourApp.dll"]



コンソールアプリケーション向けの調整

もし、コンソールアプリケーションやバックグラウンドサービス (非ASP.NET Core) を開発する場合は、ランタイムイメージを変更する。

 # ASP.NET Coreの代わりに、基本的な.NETランタイムを使用
 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
 
 # ビルド部分は同様
 # ...略
 
 FROM mcr.microsoft.com/dotnet/runtime:8.0 AS final
 WORKDIR /app
 COPY --from=publish /app/publish .
 ENTRYPOINT ["dotnet", "YourApp.dll"]



.NET 5から10までの各バージョンの指定方法

各.NETバージョンに対応する場合は、イメージタグを変更する。

 # .NET 5 (サポート終了済み)
 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
 FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS final
 
 # .NET 6 (LTS - サポート終了済み)
 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS final
 
 # .NET 7 (サポート終了済み)
 FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
 FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS final
 
 # .NET 8 (LTS - 2026年11月までサポート)
 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
 
 # .NET 9 (2026年11月までサポート)
 FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
 FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final
 
 # .NET 10(2028年11月までサポート)
 FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
 FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final