共用方式為


自訂容器圖像以進行偵錯

注意

本節說明選擇 Dockerfile 容器建置類型時,如何自訂 Docker 容器。 如果您使用 .NET SDK 建置類型,自訂選項會有所不同,而本節中的大部分資訊也不適用。 請另行參閱使用 dotnet publish 將 .NET 應用程式容器化

偵錯設定中進行建置時,Visual Studio 會進行數個最佳化動作,以協助提高容器化專案的建置程序效能。 容器化應用程式的建置程序並不像直接遵循 Dockerfile 中所述的步驟一樣簡單。 在容器中建置比在本機電腦上建置慢。 因此,當您在偵錯設定中進行建置時,Visual Studio 實際上會在本機電腦上建置專案,然後使用磁碟區掛接來與容器共用輸出資料夾。 啟用此最佳化方式的建置稱為快速模式組建。

在 [快速] 模式中,Visual Studio 會使用引數呼叫 docker build,告知 Docker 只建置 Dockerfile 中的第一個階段 (通常是 base 階段)。 您可以藉由設定 MSBuild 屬性 DockerfileFastModeStage,如 Container Tools MSBuild 屬性所述來變更此屬性。 Visual Studio 會處理程序的其餘部分,且不考慮 Dockerfile 的內容。 因此,當您修改 Dockerfile 時,例如自訂容器環境或安裝其他相依性時,您應該將修改放在第一個階段。 放在 Dockerfile 的 buildpublishfinal 階段中的任何自訂步驟都不會執行。

此效能最佳化通常只有當您在偵錯設定中進行建置時,才會發生。 在發行設定中,建置會在 Dockerfile 中指定的容器中發生。 您可以將專案檔案中的ContainerDevelopmentMode設定為快速,以啟用發行設定的此行為:

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

如果您想要停用所有設定的效能最佳化,並如 Dockerfile 所指定的方式進行建置,請將專案檔中的 ContainerDevelopmentMode 屬性設定為 Regular,如下所示:

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

若要還原效能最佳化,請從專案檔中移除該屬性。

開始偵錯時 (F5),會重複使用先前啟動的容器 (如果有的話)。 如果您不想重複使用先前的容器,可以使用 Visual Studio 中的 RebuildClean 命令,強制 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 套件,但僅限於偵錯模式。 此套件提供 Visual Studio 所需的命令pidof (當目標是 .NET 5 或更早版本時),但此命令不在此處使用的 Mariner 圖像中。 我們用於快速模式偵錯的階段是 debug,也就是此處定義的自訂階段。 快速模式階段不需要繼承自 buildpublish 階段,而是可以直接從 base 階段繼承,因為 Visual Studio 會掛接磁碟區,其中會包含執行應用程式所需的所有項目,如本文稍早所述。

#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"]

在專案檔中,新增此設定以告知 Visual Studio 在偵錯時使用您的自訂階段 debug

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

使用 AOT 部署自訂偵錯圖像

為了支援原生 AOT 部署,會安裝 GNU 偵錯工具 (GDB),但只會安裝在偵錯時所使用的映像上,而不是最終執行階段映像。 Dockerfile 包含建置引數 LAUNCHING_FROM_VS,可能是 truefalse。 如果 true,則會使用 aotdebug 階段,也就是安裝 GDB 的階段。 請注意,Visual Studio 僅支援原生 AOT 和 GDB for Linux 容器。

# 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 或生產環境中啟動時,不會影響所使用的最終映像。 例如,您可以安裝只在偵錯期間使用的工具。