Containerafbeeldingen aanpassen voor debuggen
Notitie
In deze sectie wordt beschreven hoe u uw Docker-containers kunt aanpassen wanneer u het buildtype Dockerfile-container kiest. Als u het buildtype .NET SDK gebruikt, zijn de aanpassingsopties verschillend en is de meeste informatie in deze sectie niet van toepassing. Zie in plaats daarvan Een .NET-app containeriseren met dotnet publish.
Wanneer u in de Debug-configuratie bouwt, zijn er verschillende optimalisaties die Visual Studio biedt voor de prestaties van het buildproces voor gecontaineriseerde projecten. Het buildproces voor apps in containers is niet zo eenvoudig als het volgen van de stappen die worden beschreven in het Dockerfile. Het bouwen in een container is langzamer dan het bouwen op de lokale computer. Dus wanneer u in de Foutopsporing configuratie bouwt, bouwt Visual Studio uw projecten daadwerkelijk op de lokale computer en deelt de uitvoermap vervolgens met behulp van volume koppelen aan de container. Een build waarvoor deze optimalisatie is ingeschakeld, wordt een build Fast-modus genoemd.
In Fast-modus roept Visual Studio docker build
aan met een argument waarmee Docker alleen de eerste fase in het Dockerfile (normaal gesproken de base
fase) bouwt. U kunt dit wijzigen door de MSBuild-eigenschap, DockerfileFastModeStage
, die wordt beschreven in Container Tools MSBuild-eigenschappenin te stellen. Visual Studio verwerkt de rest van het proces zonder rekening te houden met de inhoud van het Dockerfile. Dus wanneer u uw Dockerfile wijzigt, zoals het aanpassen van de containeromgeving of het installeren van extra afhankelijkheden, moet u uw wijzigingen in de eerste fase plaatsen. Aangepaste stappen die in de dockerfile-build
, publish
of final
fasen worden geplaatst, worden niet uitgevoerd.
Deze prestatieoptimalisatie vindt normaal gesproken alleen plaats wanneer u in de Foutopsporing configuratie bouwt. In de Release-configuratie vindt de build plaats in de container zoals opgegeven in het Dockerfile. U kunt dit gedrag voor de releaseconfiguratie inschakelen door ContainerDevelopmentMode
in te stellen op Fast- in het projectbestand:
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<ContainerDevelopmentMode>Fast</ContainerDevelopmentMode>
</PropertyGroup>
Als u de optimalisatie van de prestaties voor alle configuraties wilt uitschakelen en wilt bouwen zoals gespecificeerd in de Dockerfile, stelt u de eigenschap ContainerDevelopmentMode in het projectbestand als volgt in op Regular.
<PropertyGroup>
<ContainerDevelopmentMode>Regular</ContainerDevelopmentMode>
</PropertyGroup>
Als u de optimalisatie van prestaties wilt herstellen, verwijdert u de eigenschap uit het projectbestand.
Wanneer u foutopsporing (F5) start, wordt indien mogelijk een eerder gestarte container hergebruikt. Als u de vorige container niet opnieuw wilt gebruiken, kunt u opnieuw opbouwen of opdrachten opschonen in Visual Studio gebruiken om Visual Studio te dwingen een nieuwe container te gebruiken.
Het proces voor het uitvoeren van het foutopsporingsprogramma is afhankelijk van het type project- en containerbesturingssysteem:
Scenario | Debuggerproces |
---|---|
.NET Core-apps (Linux-containers) | Visual Studio downloadt vsdbg en wijst deze toe aan de container. Vervolgens wordt het aangeroepen met uw programma en argumenten (dat wil dotnet webapp.dll ) en wordt het foutopsporingsprogramma gekoppeld aan het proces. |
.NET Core-apps (Windows-containers) | Visual Studio maakt gebruik van onecoremsvsmon en wijst deze toe aan de container, voert deze uit als het toegangspunt en vervolgens maakt Visual Studio er verbinding mee en wordt gekoppeld aan het programma. |
.NET Framework-apps | Visual Studio maakt gebruik van msvsmon en wijst deze toe aan de container, voert deze uit als onderdeel van het toegangspunt waar Visual Studio verbinding mee kan maken en wordt gekoppeld aan het programma. Dit is vergelijkbaar met hoe u normaal gesproken externe foutopsporing op een andere computer of virtuele machine zou instellen. |
Zie Offroad-foutopsporing van .NET Core in Linux en OS X van Visual Studiovoor meer informatie over vsdbg.exe
.
Containerafbeelding wijzigen voor foutopsporing en productie
Als u de containerafbeelding voor foutopsporing en productie wilt wijzigen, past u de base
fase aan. Voeg uw aanpassingen toe aan het Dockerfile in de sectie basisfase, meestal de eerste sectie in het Dockerfile. Raadpleeg de Dockerfile-verwijzing in de Docker-documentatie voor informatie over Dockerfile-opdrachten.
# 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"]
Containerafbeelding alleen wijzigen voor foutopsporing
U kunt uw containers op bepaalde manieren aanpassen om te helpen bij het opsporen van fouten, zoals het installeren van iets voor diagnostische doeleinden, zonder dat dit van invloed is op productie-builds.
Als u de container alleen wilt wijzigen voor foutopsporing, maakt u een fase en gebruikt u vervolgens de eigenschap MSBuild DockerfileFastModeStage
om Visual Studio te laten weten dat u uw aangepaste fase moet gebruiken bij het opsporen van fouten. Raadpleeg de Dockerfile-verwijzing in de Docker-documentatie voor informatie over Dockerfile-opdrachten.
Notitie
De instructies hier zijn van toepassing op de case met één container. U kunt ook hetzelfde doen voor meerdere containers met Docker Compose, maar de technieken die vereist zijn voor Docker Compose, zijn iets anders. De fase wordt bijvoorbeeld bepaald door een instelling in het dockercompose.debug.yml
-bestand.
In het volgende voorbeeld installeren we het pakket procps-ng
, maar alleen in de foutopsporingsmodus. Dit pakket levert het commando pidof
, dat Visual Studio vereist wanneer gericht op .NET 5 en eerder, maar niet in de Mariner-image aanwezig is die hier wordt gebruikt. De fase die we gebruiken voor snelle foutopsporing in de modus is debug
, een aangepaste fase die hier is gedefinieerd. De fase in de snelle modus hoeft niet over te nemen van de build
of publish
fase, maar kan deze rechtstreeks overnemen van de base
fase, omdat Visual Studio een volume koppelt dat alles bevat wat nodig is om de app uit te voeren, zoals eerder in dit artikel is beschreven.
#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"]
Voeg in het projectbestand deze instelling toe om Visual Studio te laten weten dat u uw aangepaste fase debug
moet gebruiken bij het opsporen van fouten.
<PropertyGroup>
<!-- other property settings -->
<DockerfileFastModeStage>debug</DockerfileFastModeStage>
</PropertyGroup>
Foutopsporingsafbeeldingen aanpassen met AOT-uitrol
Ter ondersteuning van systeemeigen AOT-implementatie wordt het GNU-foutopsporingsprogramma (GDB) geïnstalleerd, maar alleen op de installatiekopieën die worden gebruikt bij het opsporen van fouten, niet de uiteindelijke runtime-installatiekopieën. Het Dockerfile bevat een build-argument LAUNCHING_FROM_VS
dat kan worden true
of false
. Als true
, wordt de aotdebug
-fase gebruikt, waar GDB is geïnstalleerd. Visual Studio ondersteunt alleen systeemeigen AOT- en GDB voor Linux-containers.
# 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"]
U kunt aotstage
in de Dockerfile gebruiken om de afbeelding die tijdens foutopsporing wordt gebruikt, aan te passen, zonder dat dit invloed heeft op de uiteindelijke afbeelding die wordt gebruikt wanneer niet gestart wordt vanuit Visual Studio of in productie. U kunt bijvoorbeeld een hulpprogramma installeren dat alleen kan worden gebruikt tijdens foutopsporing.