Anpassen von Containerimages für das Debuggen
Hinweis
In diesem Abschnitt wird beschrieben, wie Sie Ihre Docker-Container anpassen können, wenn Sie den Dockerfile-Containerbuildtyp auswählen. Wenn Sie den .NET SDK-Buildtyp verwenden, unterscheiden sich die Anpassungsoptionen und die meisten Informationen in diesem Abschnitt gelten nicht. Siehe stattdessen Containerisierung einer .NET-Anwendung mit dotnet publish.
Beim Erstellen von Builds in der Konfiguration Debuggen führt Visual Studio mehrere Optimierungen durch, um die Leistung des Buildprozesses für Containerprojekte zu erhöhen. Der Buildprozess für Container-Apps ist komplexer, sodass nicht einfach die in der Dockerfile beschriebenen Schritte ausgeführt werden können. Ein Build in einem Container ist langsamer als ein Build auf einem lokalen Computer. Wenn Sie also für den Build die Debugkonfiguration nutzen, erstellt Visual Studio Ihre Projekte auf dem lokalen Computer und gibt den Ausgabeordner dann für den Container frei, indem das Volume eingebunden wird. Ein Build mit dieser Optimierung wird auch als Schnellmodusbuild bezeichnet.
Im Schnell-Modus ruft Visual Studio docker build
mit einem Argument auf, das Docker anweist, nur die erste Stage in der Dockerfile zu erstellen (normalerweise die base
-Stage). Sie können dies ändern, indem Sie die MSBuild-Eigenschaft festlegen, DockerfileFastModeStage
, die unter den Containertools MSBuild-Eigenschaften beschrieben wird. Die restlichen Schritte führt Visual Studio durch, ohne den Inhalt des Dockerfile zu beachten. Wenn Sie das Dockerfile ändern, um beispielsweise die Containerumgebung anzupassen oder zusätzliche Abhängigkeiten zu installieren, sollten Sie die Änderungen in der ersten Stage ablegen. Wenn benutzerdefinierte Schritte in den Stages build
, publish
und final
der Dockerfile hinterlegt werden, werden diese nicht ausgeführt.
Diese Leistungsoptimierung wird normalerweise nur durchgeführt, wenn Sie für den Build die Debugkonfiguration verwenden. In der Releasekonfiguration findet der Build wie im Dockerfile angegeben im Container statt. Sie können dieses Verhalten für die Releasekonfiguration aktivieren, indem Sie ContainerDevelopmentMode
in der Projektdatei auf Fast festlegen:
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<ContainerDevelopmentMode>Fast</ContainerDevelopmentMode>
</PropertyGroup>
Wenn Sie die Leistungsoptimierung für alle Konfigurationen deaktivieren und das Build wie in der Dockerfile-Datei angegeben ausführen möchten, legen Sie die Eigenschaft ContainerDevelopmentMode in der Projektdatei wie folgt auf Regular fest:
<PropertyGroup>
<ContainerDevelopmentMode>Regular</ContainerDevelopmentMode>
</PropertyGroup>
Wenn Sie die Leistungsoptimierung wiederherstellen möchten, entfernen Sie die Eigenschaft aus der Projektdatei.
Wenn Sie mit dem Debuggen beginnen (F5), wird nach Möglichkeit ein zuvor gestarteter Container wiederverwendet. Wenn Sie den vorherigen Container nicht wiederverwenden möchten, können Sie in Visual Studio die Befehle Rebuild (Neu erstellen) oder Bereinigen verwenden, um zu erzwingen, dass Visual Studio einen neuen Container verwendet.
Die Ausführung des Debuggers hängt von der Art des Projekts und dem Containerbetriebssystem ab:
Szenario | Debuggerprozess |
---|---|
.NET Core-Apps (Linux-Container) | Visual Studio lädt vsdbg herunter und ordnet es dem Container zu. Dann wird es mit Ihrem Programm und Argumenten (d. h. dotnet webapp.dll ) aufgerufen, und anschließend wird der Debugger an den Prozess angefügt. |
.NET Core-Apps (Windows-Container) | Visual Studio verwendet onecoremsvsmon , ordnet es dem Container zu und führt es als Einstiegspunkt aus. Dann stellt Visual Studio eine Verbindung damit her und fügt es an das Programm an. |
.NET Framework-Apps | Visual Studio verwendet msvsmon , ordnet es dem Container zu, führt es als Einstiegspunkt aus, an dem sich Visual Studio damit verbinden kann, und fügt es an das Programm an. Dies ähnelt der Vorgehensweise beim Einrichten des Remotedebuggens auf einem anderen oder virtuellen Computer. |
Informationen zu vsdbg.exe
finden Sie unter Offroad-Debuggen von .NET Core unter Linux und OS X in Visual Studio.
Ändern des Containerimages für Debuggen und Produktion
Um das Containerimage sowohl für das Debuggen als auch für die Produktion zu ändern, bearbeiten Sie die Phase base
. Fügen Sie Ihre benutzerdefinierten Anpassungen der Dockerfile im Abschnitt der Phase „base“ hinzu, normalerweise der erste Abschnitt in der Dockerfile. Informationen zu den Dockerfile-Befehlen finden Sie in der Docker-Dokumentation in der Dockerfile-Referenz.
# 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"]
Ändern des Containerimages nur für das Debuggen
Sie können Ihre Container auf bestimmte Weise anpassen, um das Debuggen zu unterstützen, z. B. die Installation von Diagnosefunktionen, ohne dass sich dies auf Produktionsbuilds auswirkt.
Um den Container nur für das Debuggen zu ändern, erstellen Sie eine Phase. Weisen Sie Visual Studio dann mit der MSBuild-Eigenschaft DockerfileFastModeStage
an, Ihre benutzerdefinierte Phase beim Debuggen zu verwenden. Informationen zu den Dockerfile-Befehlen finden Sie in der Docker-Dokumentation in der Dockerfile-Referenz.
Hinweis
Die hier aufgeführten Anweisungen gelten für Einzelcontainer. Sie können dasselbe Verfahren mithilfe von Docker Compose für mehrere Container ausführen. Allerdings unterscheiden sich die Techniken, die für Docker Compose erforderlich sind, geringfügig. Beispielsweise wird die Phase durch eine Einstellung in der Datei dockercompose.debug.yml
gesteuert.
Im folgenden Beispiel installieren wir das Paket procps-ng
, allerdings nur im Debugmodus. Dieses Paket stellt den Befehl pidof
bereit, den Visual Studio (für .NET 5 und früher) benötigt, der aber in dem hier verwendeten Mariner-Image nicht enthalten ist. Die Phase, die wir für das Debuggen im schnellen Modus verwenden, ist debug
, eine hier definierte benutzerdefinierte Phase. Die Phase im schnellen Modus muss nicht von der Phase build
oder publish
erben. Sie kann direkt von der Phase base
erben, da Visual Studio ein Volume einbindet, das alles enthält, was für die Ausführung der App benötigt wird, wie bereits in diesem Artikel beschrieben.
#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"]
Fügen Sie der Projektdatei diese Einstellung hinzu, um Visual Studio anzuweisen, beim Debuggen Ihre benutzerdefinierte Phase debug
zu verwenden.
<PropertyGroup>
<!-- other property settings -->
<DockerfileFastModeStage>debug</DockerfileFastModeStage>
</PropertyGroup>
Anpassen von Debugimages mit AOT-Bereitstellung
Zur Unterstützung der nativen AOT-Bereitstellung wird der GNU-Debugger (GDB) installiert, aber nur auf dem Image, das beim Debuggen verwendet wird, nicht das endgültige Laufzeitimage. Die Dockerfile-Datei enthält ein Buildargument LAUNCHING_FROM_VS
, das sein true
kann oder false
. Wenn true
die aotdebug
Phase verwendet wird, wo GDB installiert ist. Beachten Sie, dass Visual Studio nur systemeigene AOT und GDB für Linux-Container unterstützt.
# 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"]
Sie können aotstage
in der Dockerfile-Datei verwenden, um das zum Debugzeit verwendete Image anzupassen, ohne dass sich dies auf das endgültige Image auswirkt, das beim Starten von Visual Studio oder in der Produktion verwendet wird. Sie können z. B. ein Tool nur für die Verwendung beim Debuggen installieren.