Sdílet prostřednictvím


Přizpůsobení obrazů kontejneru pro ladění

Poznámka

Tato část popisuje, jak můžete kontejnery Dockeru přizpůsobit, když zvolíte typ sestavení kontejneru Dockerfile. Pokud používáte typ sestavení sady .NET SDK, možnosti přizpůsobení se liší a většina informací v této části se nedá použít. Podívejte se raději na Kontejnerizujte aplikaci .NET pomocí dotnet publish.

Při sestavování v ladicí konfiguraci provádí Visual Studio několik optimalizací, které zlepšují výkon procesu sestavení u kontejnerizovaných projektů. Proces sestavení pro kontejnerizované aplikace není tak jednoduchý, jako když jednoduše postupujete podle kroků uvedených v souboru Dockerfile. Sestavování v kontejneru je pomalejší než sestavování na místním počítači. Když tedy sestavíte v konfiguraci Debug, Visual Studio ve skutečnosti sestaví projekty na místním počítači a potom sdílí výstupní složku do kontejneru pomocí připojení svazku. Sestavení s touto povolenou optimalizací se nazývá sestavení v režimu Fast.

V režimu Fast visual Studio volá docker build s argumentem, který dockeru říká, aby v souboru Dockerfile sestavil pouze první fázi (obvykle base fázi). To můžete změnit nastavením vlastnosti MSBuild, DockerfileFastModeStage, popsanou v MSBuild vlastnosti nástrojů kontejneru. Visual Studio zpracovává zbytek procesu bez ohledu na obsah souboru Dockerfile. Při úpravě souboru Dockerfile, například přizpůsobení prostředí kontejneru nebo instalaci dalších závislostí, byste měli změny vložit do první fáze. Všechny vlastní kroky umístěné v souboru Dockerfile ve fázích build, publishnebo final se nespustí.

K této optimalizaci výkonu dochází obvykle pouze při sestavování v ladicí konfiguraci . V konfiguraci release dojde k sestavení v kontejneru, jak je uvedeno v souboru Dockerfile. Toto chování pro konfiguraci vydané verze můžete povolit nastavením ContainerDevelopmentMode na Fast v souboru projektu:

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

Pokud chcete zakázat optimalizaci výkonu pro všechny konfigurace a sestavit tak, jak určuje soubor Dockerfile, nastavte vlastnost ContainerDevelopmentMode na Regular v souboru projektu následujícím způsobem:

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

Pokud chcete obnovit optimalizaci výkonu, odeberte vlastnost ze souboru projektu.

Když spustíte ladění (F5), použije se dříve spuštěný kontejner, pokud je to možné. Pokud nechcete znovu použít předchozí kontejner, můžete použít příkazy Rebuild nebo Clean v sadě Visual Studio k vynucení použití nového kontejneru.

Proces spuštění ladicího programu závisí na typu projektu a kontejnerového operačního systému:

Scénář Proces ladicího programu
.NET Core aplikace (linuxové kontejnery) Visual Studio stáhne vsdbg, mapuje ho do kontejneru, pak ho spustí s vaším programem a argumenty (tj. dotnet webapp.dll) a poté se ladicí program připojí k procesu.
aplikace .NET Core (kontejnery Windows) Visual Studio používá onecoremsvsmon, mapuje ho na kontejner, spustí ho jako vstupní bod programu a poté se Visual Studio připojí ke kontejneru a naváže k programu.
aplikace .NET Framework Visual Studio používá msvsmon a mapuje ho na kontejner, spustí ho jako součást vstupního bodu, kde se k němu Visual Studio může připojit a připojí se k programu. Podobá se tomu, jak byste normálně nastavili vzdálené ladění na jiném počítači nebo virtuálním počítači.

Informace o vsdbg.exenajdete v tématu offroad ladění .NET Core na Linuxu a OS X v sadě Visual Studio.

Úprava obrazu kontejneru pro ladění a produkci

Pokud chcete upravit obraz kontejneru pro ladění i produkční prostředí, upravte fázi base. Přidejte vlastní nastavení do souboru Dockerfile v oddílu základní fáze, obvykle první oddíl souboru Dockerfile. Informace o příkazech Dockerfile najdete v referenčním dokumentu Dockerfile v dokumentaci k Dockeru.

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

Úprava obrazu kontejneru pouze pro ladění

Kontejnery můžete přizpůsobit určitými způsoby, které vám pomůžou při ladění, například instalaci něčeho pro diagnostické účely, aniž by to mělo vliv na produkční buildy.

Pokud chcete upravit kontejner pouze pro ladění, vytvořte pracovní fázi a pak pomocí vlastnosti MSBuild DockerfileFastModeStage označte Visual Studio, aby při ladění používalo vámi přizpůsobenou pracovní fázi. Informace o příkazech Dockerfile najdete v referenčním souboru Dockerfile v dokumentaci k Dockeru.

Poznámka

Pokyny zde platí pro případ s jedním kontejnerem. Stejný postup můžete provést také u více kontejnerů pomocí Docker Compose, ale techniky potřebné pro Docker Compose se mírně liší. Fáze je například řízena nastavením v souboru dockercompose.debug.yml.

V následujícím příkladu nainstalujeme balíček procps-ng, ale pouze v režimu ladění. Tento balíček poskytuje příkaz pidof, který Visual Studio vyžaduje (při cílení na .NET 5 a starší), ale není v obrazu Mariner používaném zde. Fáze, která používáme pro rychlé ladění režimu, je debug, vlastní fáze definovaná zde. Fáze rychlého režimu nemusí dědit z fáze build nebo publish, může dědit přímo z fáze base, protože Visual Studio připojí svazek obsahující vše potřebné ke spuštění aplikace, jak je zmíněno výše v tomto článku.

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

Do souboru projektu přidejte toto nastavení, abyste Visual Studiu řekli, aby při ladění používalo váš vlastní krok debug.

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

Přizpůsobení ladění imagí s nasazením AOT

Pro podporu nativního nasazení AOT se nainstaluje ladicí program GNU (GDB), ale pouze na obraz použitý při ladění, nikoli na finální runtime obraz. Soubor Dockerfile obsahuje argument sestavení LAUNCHING_FROM_VS, který může být true nebo false. Pokud true, použije se fáze aotdebug, ve které je nainstalovaná GDB. Všimněte si, že Visual Studio podporuje pouze nativní AOT a GDB pro linuxové kontejnery.

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

Pomocí aotstage v souboru Dockerfile můžete přizpůsobit obraz použitý v době ladění, aniž by to mělo vliv na konečný obraz při nespouštění ze sady Visual Studio nebo v produkčním prostředí. Můžete například nainstalovat nástroj pro použití pouze při ladění.