次の方法で共有


Visual Studio で Docker コンテナーをカスタマイズする

コンテナー イメージをカスタマイズするには、プロジェクトに Docker サポートを追加するときに Visual Studio によって生成される Dockerfile を編集します。 Visual Studio IDE からカスタマイズ済みコンテナーをビルドする場合でも、コマンドライン ビルドを設定する場合でも、プロジェクトのビルドのために Visual Studio によって Dockerfile が使用されるしくみを知っておく必要があります。 このような詳細については、Visual Studio は Dockerfile からは明らかでないコンテナー化されたアプリをビルドして実行するための特別なプロセスに従うというパフォーマンス上の理由から知っておく必要があります。

Dockerfile で変更を加え、デバッグ コンテナーと運用環境コンテナーの両方で結果を確認するとします。 この場合、Dockerfile にコマンドを追加して、最初のステージ (通常 base) を変更できます。 「デバッグと運用のためにコンテナー イメージを変更する」を参照してください。 ただし、(運用環境ではなく) デバッグ時にのみ変更を行う場合は、別のステージを作成し、DockerfileFastModeStage ビルド設定を使用して、そのステージをデバッグ ビルドに使用するように Visual Studio に指示する必要があります。 「デバッグ用にのみコンテナー イメージを変更する」を参照してください。

この記事では、コンテナー化されたアプリの Visual Studio ビルド プロセスについてある程度詳しく説明します。その後、Dockerfile を変更してデバッグ ビルドと運用環境ビルドの両方、またはデバッグ用にのみ影響を与える方法について説明します。

Visual Studio での Dockerfile ビルド

Note

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

マルチステージ ビルド

Visual Studio では、Docker コンテナーを使用しないプロジェクトをビルドするときに、ローカル コンピューター上で MSBuild が呼び出され、ローカル ソリューション フォルダーの下のフォルダー (通常は bin) 内に出力ファイルが生成されます。 ただし、コンテナー化されたプロジェクトの場合、コンテナー化されたアプリをビルドするため、ビルド プロセスで Dockerfile の命令が考慮されます。 Visual Studio で使用される Dockerfile は、複数のステージに分割されます。 このプロセスは、Docker のマルチステージ ビルド機能に依存しています。

マルチステージ ビルド機能を使用すると、コンテナーのビルド プロセスが効率化され、実行時にアプリに必要なビットしか含めないようにすることで、コンテナーのサイズを小さくすることができます。 マルチステージ ビルドは、.NET Framework プロジェクトではなく、.NET Core プロジェクトに使用されます。

マルチステージ ビルドを使用すると、中間イメージを生成するステージでコンテナー イメージを作成できます。 たとえば、次のような一般的な Dockerfile があるとします。 最初のステージは、Visual Studio によって生成される Dockerfile では base と呼ばれますが、ツールではその名前は必要ありません。

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

Dockerfile 内の行は、Microsoft Container Registry (mcr.microsoft.com) の ASP.NET イメージから始まり、ポート 80 および 443 を公開する中間イメージ base が作成され、作業ディレクトリが /app に設定されます。

次のステージは build で、次のように表示されます。

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

build のステージは、base からの続きではなく、レジストリ (aspnet ではなく sdk) からの別の、元のイメージから開始されることがわかります。 sdk のイメージにはすべてのビルド ツールがあるため、実行時コンポーネントのみを含む aspnet イメージよりもかなり大きくなります。 別のイメージを使用する理由は、Dockerfile の残りの部分を確認すると明確になります。

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
RUN dotnet publish "WebApplication43.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", "WebApplication43.dll"]

最後のステージは、もう一度 base から始まります。発行された出力を最終イメージにコピーするための COPY --from=publish が含まれます。 このプロセスを使用すると、sdk イメージに含まれていたすべてのビルド ツールを含める必要がないため、最終的なイメージがかなり小さくなる可能性があります。

次の表は、Visual Studio によって作成される一般的な Dockerfile で使用されるステージをまとめたものです。

段階 説明
base ビルドされたアプリが発行されるベース ランタイム イメージを作成します。 ポートや環境変数など、実行時に使用できる必要がある設定はここで行います。 このステージは VS から高速モードで実行する場合に使用されます (デバッグ構成の既定)。
build プロジェクトはこのステージでビルドされます。 .NET SDK ベース イメージが使用されます。このイメージには、プロジェクトのビルドに必要なコンポーネントが含まれています。
publish このステージはビルド ステージから派生し、プロジェクトを発行します。プロジェクトは最終ステージにコピーされます。
final このステージではアプリを起動する方法を構成し、本番環境内または VS から通常モードで実行する場合に使用します (デバッグ構成を使用しない場合の既定)。
aotdebug このステージは、通常モードでのデバッグをサポートするために VS から起動する際の最終ステージのベースとして使用されます (デバッグ構成を使用しない場合の既定)。

Note

aotdebug ステージは Linux コンテナーでのみサポートされています。 プロジェクトでネイティブ Ahead Of Time (AOT) デプロイが有効になっている場合に、Visual Studio 2022 17.11 以降で使用されます。

プロジェクトのウォームアップ

プロジェクトのウォームアップとは、後続の実行 (F5 キーまたは Ctrl+F5 キー) のパフォーマンスを向上させるために、プロジェクトの Docker プロファイルが選択されたとき (つまり、プロジェクトが読み込まれたとき、または Docker のサポートが追加されたとき) に実行される一連の手順を指します。 この動作は、[ツール]>[オプション]>[コンテナー ツール] で構成できます。 バックグラウンドでは、次のタスクが実行されます。

  • Docker Desktop がインストールされ、実行されていることを確認します。
  • Docker Desktop がプロジェクトと同じオペレーティング システムに設定されていることを確認します。
  • Dockerfile の最初のステージ (ほとんどの Dockerfile では base ステージ) でイメージをプルします。
  • Dockerfile をビルドし、コンテナーを開始します。

ウォームアップは高速モードでのみ発生するため、実行中のコンテナーには app フォルダーがボリューム マウントされています。 つまり、アプリに変更を加えてもコンテナーは無効になりません。 この動作により、デバッグのパフォーマンスが大幅に向上し、大きなイメージのプルなどの長時間実行されるタスクの待機時間が短縮されます。

詳細なコンテナー ツール ログを有効にする

診断の目的で、特定のコンテナー ツール ログを有効にできます。 これらのログを有効にするには、特定の環境変数を設定します。 単一コンテナー プロジェクトの場合、環境変数は MS_VS_CONTAINERS_TOOLS_LOGGING_ENABLED で、%tmp%\Microsoft.VisualStudio.Containers.Tools にログが記録されます。 Docker Compose プロジェクトの場合は MS_VS_DOCKER_TOOLS_LOGGING_ENABLED で、%tmp%\Microsoft.VisualStudio.DockerCompose.Tools にログされます。

警告

ログが有効で、かつ Azure 認証にトークン プロキシを使用している場合、認証資格情報がプレーン テキストとしてログに記録される場合があります。 詳しくは、「Azure 認証を構成する」をご覧ください。

次のステップ

デバッグ時のみイメージにツールをインストールする方法など、Dockerfile ステージを使用して、デバッグと運用環境で使用するイメージをカスタマイズする方法について説明します。 デバッグについては、コンテナー イメージの構成方法に関する記事を参照してください。