次の方法で共有


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

手記

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

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

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

このパフォーマンスの最適化は、通常、デバッグ 構成でビルドする場合にのみ発生します。 リリース 構成では、Dockerfile で指定されたコンテナーでビルドが行われます。 プロジェクト ファイルで ContainerDevelopmentMode[高速] に設定することで、リリース構成にこの動作を有効にすることができます。

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

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

<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 リファレンス を参照してください。

# 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 リファレンス を参照してください。

手記

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

次の例では、パッケージ procps-ngをインストールしますが、デバッグ モードでのみインストールします。 このパッケージはコマンド pidofを提供します。このコマンドは、Visual Studio で (.NET 5 以前をターゲットにしている場合) 必要ですが、ここで使用されるマリナー イメージには含まれません。 高速モード デバッグに使用するステージは、ここで定義されているカスタム ステージである 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 から起動しない場合や運用環境で使用される最終的なイメージに影響を与えることなく、デバッグ時に使用されるイメージをカスタマイズできます。 たとえば、デバッグ時にのみ使用するツールをインストールできます。