Поделиться через


Настройка образов контейнеров для отладки

Примечание.

В этом разделе описывается, как настроить контейнеры Docker при выборе типа сборки контейнера Dockerfile. Если вы используете тип сборки пакета SDK для .NET, параметры настройки отличаются, и большинство сведений в этом разделе неприменимо. Вместо этого см. раздел "Контейнеризация приложения .NET с помощью dotnet publish".

При сборке в конфигурации отладки существует несколько оптимизаций, которые Visual Studio помогает с производительностью процесса сборки для контейнерных проектов. Процесс сборки для контейнерных приложений не так прост, как просто после выполнения шагов, описанных в Dockerfile. Сборка в контейнере медленнее, чем сборка на локальном компьютере. Поэтому при сборке в конфигурации отладки Visual Studio на самом деле выполняет сборку проектов на локальном компьютере, а затем предоставляет доступ к папке с выходными данными контейнеру путем подключения к тому. Сборка с такой оптимизацией называется сборкой в быстром режиме.

В быстром режиме Visual Studio вызывается docker build с аргументом, который сообщает Docker создать только первый этап в Dockerfile (обычно этап base ). Это можно изменить, задав свойство MSBuild, DockerfileFastModeStageописанное в свойствах MSBuild для контейнеров. Остальные этапы процесса выполняет сама среда Visual Studio с учетом содержимого Dockerfile. Поэтому, когда вы изменяете файл Dockerfile, например для настройки среды контейнера или установки дополнительных зависимостей, изменения должны вноситься на первом этапе. Любые пользовательские шаги, размещенные в dockerfile build, publishили final этапы не выполняются.

Эта оптимизация производительности обычно возникает только при сборке в конфигурации отладки . В конфигурации выпуска сборка выполняется в контейнере, как указано в Dockerfile. Это поведение можно включить для конфигурации выпуска, задав ContainerDevelopmentMode значение Fast в файле проекта:

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

Если вы хотите отключить оптимизацию производительности для всех конфигураций и выполнить сборку в виде файла Dockerfile, задайте для свойства ContainerDevelopmentMode значение Regular в файле проекта следующим образом:

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

Чтобы снова включить оптимизацию производительности, удалите это свойство из файла проекта.

При запуске отладки (F5) используется ранее запущенный контейнер, если это возможно. Если вы не хотите повторно использовать имеющийся контейнер, можно выбрать в 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статье Об отладке .NET Core в Linux и OS X из Visual Studio.

Изменение образа контейнера для среды отладки и рабочей среды

Чтобы изменить образ контейнера для среды отладки и рабочей среды, измените этап base. Добавьте настройки в Dockerfile в раздел базового этапа; как правило, это первый раздел в Dockerfile. Дополнительные сведения о командах Dockerfile см. в разделе Справочник по Dockerfile в документации по 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"]

Изменение образа контейнера только для среды отладки

Вы можете настроить контейнеры определенными способами, чтобы помочь в отладке, например установить что-то для диагностических целей, не влияя на рабочие сборки.

Чтобы изменить контейнер только для отладки, создайте этап, а затем используйте свойство DockerfileFastModeStage MSBuild, чтобы указать Visual Studio использовать настроенный этап при отладке. Дополнительные сведения о командах Dockerfile см. в разделе Справочник по Dockerfile в документации по Dockerfile.

Примечание.

Инструкции, приведенные здесь, применяются к регистру с одним контейнером. Вы также можете сделать то же самое для нескольких контейнеров с Помощью Docker Compose, но методы, необходимые для Docker Compose, немного отличаются. Например, этап управляется параметром в dockercompose.debug.yml файле.

В следующем примере мы устанавливаем пакет procps-ng, но только в режиме отладки. Этот пакет предоставляет команду pidof, требуемую Visual Studio (при целевом использовании .NET 5 и более ранних версий), но не используется здесь. Этап, который мы используем для отладки в быстром режиме, — это debug, пользовательский этап, определенный здесь. Этап быстрого режима не должен наследоваться от этапа или publish наследовать его непосредственно от build 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 сборки, который может быть true или false. aotdebug Если trueиспользуется этап, где устанавливается GDB. Обратите внимание, что Visual Studio поддерживает только собственные контейнеры AOT и GDB для 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"]

Вы можете использовать aotstage в Dockerfile для настройки образа, используемого во время отладки, не влияя на окончательный образ, используемый при не запуске из Visual Studio или в рабочей среде. Например, можно установить средство для использования только во время отладки.