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


Настройка контейнеров Docker в Visual Studio

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

Предположим, что вы хотите внести изменения в Dockerfile и увидеть результаты отладки и в рабочих контейнерах. В этом случае можно добавить команды в Dockerfile, чтобы изменить первый этап (обычно base). См. Измените образ контейнера для отладки и производственной среды. Но если вы хотите внести изменения только при отладке, но не в рабочей среде, необходимо создать еще один этап и использовать параметр сборки DockerfileFastModeStage, чтобы сообщить Visual Studio использовать этот этап для отладки сборок. См. измените образ контейнера только для отладки.

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

Сборки Dockerfile в Visual Studio

Заметка

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

Многоэтапная сборка

Когда Visual Studio создает проект, который не использует контейнеры Docker, он вызывает MSBuild на локальном компьютере и создает выходные файлы в папке (обычно bin) в локальной папке решения. Однако для контейнеризованного проекта процесс сборки учитывает инструкции Dockerfile по созданию контейнерного приложения. Файл Dockerfile, который использует Visual Studio, делится на несколько этапов. Этот процесс использует функцию многоэтапной сборки Docker.

Функция многоэтапной сборки помогает сделать процесс создания контейнеров более эффективным и сделать контейнеры меньше, позволяя им содержать только биты, необходимые приложению во время выполнения. Многоэтапная сборка используется для проектов .NET Core, а не для проектов .NET Framework.

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

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

Строки в Dockerfile начинаются с образа ASP.NET из реестра контейнеров Майкрософт (mcr.microsoft.com) и создают промежуточный образ base, который открывает порты 80 и 443 и устанавливает рабочий каталог на /app.

Следующий этап — build, который выглядит следующим образом:

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:3.1-buster-slim AS build
WORKDIR /src
COPY ["WebApplication43/WebApplication43.csproj", "WebApplication43/"]
RUN dotnet restore "WebApplication43/WebApplication43.csproj"
COPY . .
WORKDIR "/src/WebApplication43"
RUN dotnet build "WebApplication43.csproj" -c Release -o /app/build

Вы можете увидеть, что этап build начинается с другого исходного образа из реестра (sdk вместо aspnet), а не от базового. Образ sdk имеет все средства сборки, и по этой причине это гораздо больше, чем образ aspnet, который содержит только компоненты среды выполнения. Причина использования отдельного изображения становится ясной при просмотре остальной части Файла Dockerfile:

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
RUN dotnet publish "WebApplication43.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", "WebApplication43.dll"]

Последний этап начинается снова с baseи включает COPY --from=publish для копирования опубликованных выходных данных в окончательный образ. Этот процесс позволяет сделать окончательный образ гораздо меньше, так как он не должен включать все средства сборки, которые были в образе sdk.

В следующей таблице приведены этапы, используемые в типичном файле Dockerfile, созданном Visual Studio:

Сцена Описание
основа Создает базовый образ среды выполнения, в котором публикуется встроенное приложение. Параметры, которые должны быть доступны во время выполнения, см. здесь, например порты и переменные среды. Этот этап используется при запуске из VS в быстром режиме (по умолчанию для конфигурации отладки).
строить Проект построен на этом этапе. Используется базовый образ пакета SDK для .NET, который содержит компоненты, необходимые для сборки проекта.
издавать Этот этап является производным от этапа сборки и публикует проект, который будет скопирован на последний этап.
последний Этот этап настраивает, как запускать приложение, и используется в производственной среде или при запуске из VS в обычном режиме (по умолчанию, когда не используется конфигурация отладки).
aotdebug Этот этап используется в качестве основы для конечного этапа при запуске из VS для поддержки отладки в обычном режиме (по умолчанию, если не используется конфигурация отладки).

Заметка

Этап aotdebug поддерживается только для контейнеров Linux. Он используется в Visual Studio 2022 17.11 и более поздних версий, если собственном развертывании (AOT) включен в проекте.

Разогрев проекта

Подготовка проекта означает ряд шагов, которые настраиваются при выборе профиля Docker для проекта (то есть в момент загрузки проекта или добавления поддержки Docker) для повышения производительности последующих запусков (F5 или Ctrl+F5). Это поведение можно настроить в разделе Tools>Options>Container Tools. Ниже приведены задачи, выполняемые в фоновом режиме:

  • Убедитесь, что Docker Desktop установлен и запущен.
  • Убедитесь, что Docker Desktop имеет ту же операционную систему, что и проект.
  • Загрузите изображения на первом этапе "Dockerfile" (этап base в большинстве "Dockerfile").
  • Создайте Dockerfile и запустите контейнер.

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

Включение подробных журналов средств контейнера

В целях диагностики можно включить определенные журналы средств контейнеров. Эти журналы можно включить, задав определенные переменные среды. Для проектов с одним контейнером переменная среды MS_VS_CONTAINERS_TOOLS_LOGGING_ENABLED, которая затем используется для входа в систему %tmp%\Microsoft.VisualStudio.Containers.Tools. Для проектов Docker Compose это MS_VS_DOCKER_TOOLS_LOGGING_ENABLED, которые затем входят в систему в %tmp%\Microsoft.VisualStudio.DockerCompose.Tools.

Предупреждение

Если включено ведение журнала и вы используете прокси с использованием токена для аутентификации в Azure, учетные данные для аутентификации могут быть записаны в виде обычного текста. См. настройкапроверки подлинности Azure.

Дальнейшие действия

Узнайте, как использовать этапы Dockerfile для настройки образов, используемых для отладки и в производственной среде, например, как установить средство в образе только при отладке. См. раздел Настройка образов контейнеров для отладки.