Sdílet prostřednictvím


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

Tento článek popisuje, jak můžete přizpůsobit kontejnery Dockeru, 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.

Tento článek popisuje, jak můžete kontejnery 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.

Požadavky

Požadavky

  • Docker Desktop.
  • Visual Studio s nainstalovanou úlohou vývoje pro ASP.NET a webový vývoj, úlohou vývoje pro Azure a/nebo úlohou vývoje pomocí .NET pro desktop.

Optimalizace rychlého režimu

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í.

V rychlém režimu Visual Studio volá docker build nebo podman build s argumentem, který modulu kontejnerového runtime říká, aby sestavil pouze první fázi v souboru Dockerfile (obvykle fázi base). Můžete to změnit nastavením MSBuild vlastnost, ContainerFastModeStagekterá nahrazuje zastaralé DockerfileFastModeStage. Viz Vlastnosti nástroje kontejneru MSBuild. 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 a namapuje ho na kontejner, poté se spustí s vaším programem a argumenty (to znamená dotnet webapp.dll).
aplikace .NET Core (kontejnery Windows) Visual Studio používá onecoremsvsmon, namapuje jej na kontejner a spustí jako vstupní bod.
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, namapuje jej na kontejner a spustí jako vstupní bod.
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 image kontejneru pro ladění i produkční prostředí, upravte první fázi souboru Dockerfile, obvykle označovanou jako base fáze. Informace o příkazech Dockerfile najdete v referenčním dokumentu Dockerfile v dokumentaci k Dockeru.

Návod

Pokud váš projekt používá DockerfileFastModeStage vlastnost MSBuild, měli byste vybrat odpovídající fázi pro přidání přizpůsobení, které plynou do konečné fáze a DockerfileFastModeStage, pokud je to možné. Viz vlastnosti sestavení nástrojů kontejneru.

Pokud chcete upravit image kontejneru pro ladění i produkční prostředí, upravte první fázi souboru Dockerfile, obvykle označovanou jako base fáze. Informace o příkazech Dockerfile najdete v referenčním dokumentu Dockerfile v dokumentaci k Dockeru.

Návod

Pokud váš projekt používá ContainerFastModeStage vlastnosti MSBuild (nebo její zastaralé ekvivalentní DockerfileFastModeStage), měli byste vybrat odpovídající fázi pro přizpůsobení, která se promítá do konečné fáze, a ContainerFastModeStage, pokud je to možné. Viz vlastnosti sestavení nástrojů kontejneru.

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
# <add your commands here>

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.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 dokumentu Dockerfile v dokumentaci k Dockeru.

Pokud chcete upravit kontejner pouze pro ladění, vytvořte pracovní fázi a pak pomocí vlastnosti MSBuild ContainerFastModeStage 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 dokumentu 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:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

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:8.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>
  <PropertyGroup>
     <!-- other property settings -->
     <ContainerFastModeStage>debug</ContainerFastModeStage>
  </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í.