デバッグ用にコンテナー イメージをカスタマイズする

Note

このセクションでは、Dockerfile コンテナーのビルドの種類を選ぶ場合に Docker コンテナーをカスタマイズする方法について説明します。 .NET SDK のビルドの種類を使う場合は異なるカスタマイズ オプションになるため、このセクションの情報のほとんどは適用できません。 代わりに、「dotnet publish を使用して .NET アプリをコンテナー化する」を参照してください。

[デバッグ] 構成でビルドする場合、コンテナー化されたプロジェクトのビルド プロセスのパフォーマンス向上に役立つ Visual Studio の最適化がいくつかあります。 コンテナー化されたアプリのビルド プロセスは、単に Dockerfile に記載されている手順に従うほど単純ではありません。 コンテナーでのビルドは、ローカル コンピューターでのビルドよりも低速です。 そのため、デバッグ構成でビルドすると、Visual Studio によって実際にプロジェクトがローカル コンピューター上にビルドされてから、ボリューム マウントを使用して出力フォルダーがコンテナーに共有されます。 この最適化が有効になっているビルドは、高速モードのビルドと呼ばれます。

高速モードでは、Visual Studio は引数を指定して docker build を呼び出し、Dockerfile の最初のステージ (通常は base ステージ) のみをビルドするよう Docker に指示します。 これを変更するには、コンテナー ツールの MSBuild プロパティに関する記事で説明されている MSBuild プロパティ DockerfileFastModeStage を設定します。 Visual Studio では、Dockerfile の内容に関係なく、プロセスの残りの部分が処理されます。 そのため、コンテナー環境をカスタマイズしたり、追加の依存関係をインストールしたりするために Dockerfile を変更する場合は、最初のステージで変更を加える必要があります。 Dockerfile の buildpublish、または final ステージに配置されたカスタム ステップは実行されません。

このパフォーマンスの最適化は通常、デバッグ構成でビルドする場合にのみ行います。 リリース構成では、Dockerfile で指定されているように、コンテナーでビルドが実行されます。 プロジェクト ファイルで ContainerDevelopmentModeFast に設定することで、リリース構成でこの動作を有効にすることができます。

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
   <ContainerDevelopmentMode>Fast</ContainerDevelopmentMode>
</PropertyGroup>

Dockerfile によって指定されているすべての構成のパフォーマンス最適化とビルドを無効にする場合は、次のように、プロジェクト ファイルの ContainerDevelopmentMode プロパティを Regular に設定します。

<PropertyGroup>
   <ContainerDevelopmentMode>Regular</ContainerDevelopmentMode>
</PropertyGroup>

パフォーマンスの最適化を復元するには、プロジェクト ファイルからプロパティを削除します。

デバッグを開始すると (F5 キー)、可能であれば、以前に開始したコンテナーが再利用されます。 前のコンテナーを再利用しない場合は、Visual Studio で Rebuild または Clean コマンドを使用して、Visual Studio で新しいコンテナーを強制的に使用することができます。

デバッガーを実行するプロセスは、プロジェクトの種類とコンテナーのオペレーティング システムによって変わります。

シナリオ デバッガー プロセス
.NET Core アプリ (Linux コンテナー) Visual Studio によって vsdbg がダウンロードされ、コンテナーにマップされ、プログラムと引数 (つまり dotnet webapp.dll) を使って呼び出され、デバッガーによってプロセスにアタッチされます。
.NET Core アプリ (Windows コンテナー) Visual Studio によって onecoremsvsmon を使用してコンテナーにマップされ、エントリ ポイントとして実行され、Visual Studio によってはそれが接続され、プログラムにアタッチされます。
.NET Framework アプリ Visual Studio では msvsmon を使用してコンテナーがマップされ、Visual Studio から接続できるエントリ ポイントの一部として実行され、プログラムにアタッチされます。 これは、通常、別のコンピューターまたは仮想マシンでリモート デバッグを設定する方法に似ています。

vsdbg.exe の詳細については、「Visual Studio からの Linux および OS X 上の .NET Core のオフロード デバッグ」をご覧ください。

デバッグと運用のためにコンテナー イメージを変更する

デバッグと運用の両方用にコンテナー イメージを変更するには、base ステージを変更します。 カスタマイズを基本ステージ セクション (通常は Dockerfile の最初のセクション) の Dockerfile に追加します。 Dockerfile コマンドの詳細については、Docker ドキュメントの「Dockerfile reference (Dockerfile リファレンス)」を参照してください。

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
# <add your commands here>

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApplication3/WebApplication3.csproj", "WebApplication3/"]
RUN dotnet restore "WebApplication3/WebApplication3.csproj"
COPY . .
WORKDIR "/src/WebApplication3"
RUN dotnet build "WebApplication3.csproj" -c Release -o /app/build

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
RUN dotnet publish "WebApplication3.csproj" -c Release -o /app/publish

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]

デバッグ用にのみコンテナー イメージを変更する

運用ビルドに影響を与えることなく、診断目的で何かをインストールするなど、デバッグに役立つようなを特定の方法でコンテナーをカスタマイズできます。

デバッグ用にのみコンテナーを変更するには、ステージを作成してから、MSBuild プロパティ DockerfileFastModeStage を使用して、デバッグ時にカスタマイズしたステージを使用するように Visual Studio に指示します。 Dockerfile コマンドの詳細については、Docker ドキュメントの「Dockerfile reference (Dockerfile リファレンス)」を参照してください。

Note

ここでの手順は、単一コンテナーの場会に適用されます。 Docker Compose を使用して複数のコンテナーに対して同じ操作を実行することもできますが、Docker Compose に必要な手法は若干異なります。 たとえば、ステージは dockercompose.debug.yml ファイル内の設定によって制御されます。

次の例では、パッケージ procps-ng をデバッグ モードでのみインストールします。 このパッケージは、(.NET 5 以前をターゲットにする場合) Visual Studio に必要なコマンド pidof を提供しますが、ここで使用する Mariner イメージには含まれていません。 高速モードのデバッグ用に使用するステージは debug です (ここで定義されているカスタム ステージ)。 高速モード ステージは build または publish ステージから継承する必要はありません。この記事で前述したように、Visual Studio はアプリの実行に必要なすべてのものを含むボリュームをマウントするため、base ステージから直接継承できます。

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:6.0-cbl-mariner2.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM base AS debug
RUN tdnf install procps-ng -y

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:6.0-cbl-mariner2.0 AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

プロジェクト ファイルで、この設定を追加して、デバッグ時にカスタム ステージ debug を使用するように Visual Studio に指示します。

  <PropertyGroup>
     <!-- other property settings -->
     <DockerfileFastModeStage>debug</DockerfileFastModeStage>
  </PropertyGroup>

AOT デプロイでデバッグ イメージをカスタマイズする

ネイティブ AOT デプロイをサポートするために GNU デバッガー (GDB) がインストールされますが、デバッグ時に使用されるイメージにのみインストールされ、最終的なランタイム イメージにはインストールされません。 Dockerfile には、true または false になるビルド引数 LAUNCHING_FROM_VS が含まれています。 true の場合は、GDB がインストールされる aotdebug ステージが使用されます。 Visual Studio では、Linux コンテナー用のネイティブ AOT と GDB のみがサポートされることに注意してください。

# These ARGs allow for swapping out the base used to make the final image when debugging from VS
ARG LAUNCHING_FROM_VS
# This sets the base image for final, but only if LAUNCHING_FROM_VS has been defined
ARG FINAL_BASE_IMAGE=${LAUNCHING_FROM_VS:+aotdebug}

# ... (other stages omitted)

# This stage is used as the base for the final stage when launching from VS to support debugging in regular mode (Default when not using the Debug configuration)
FROM base as aotdebug
USER root
# Install GDB to support native debugging
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    gdb
USER app

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM ${FINAL_BASE_IMAGE:-mcr.microsoft.com/dotnet/runtime-deps:8.0} AS final
WORKDIR /app
EXPOSE 8080
COPY --from=publish /app/publish .
ENTRYPOINT ["./WebApplication1"]

Dockerfile の aotstage を使用すると、Visual Studio から起動しない場合や本番環境で使用される最終的なイメージに影響を与えることなく、デバッグ時に使用されるイメージをカスタマイズできます。 たとえば、デバッグ時にのみ使用するツールをインストールできます。