TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #3080 2.02K
День 2562. #ЗаметкиНаПолях
Контейнеризация .NET-приложений без Dockerfile. Окончание

Начало

Настройка образа контейнера
Здесь рассмотрим наиболее распространённые настройки. Более полный список параметров см. в официальной документации.

Задание имени и тега образа
Свойство ContainerRepository задает имя образа (репозитория). Свойство ContainerImageTags задает один или несколько тегов (разделённых точками с запятой). Если нужен один тег, можно использовать ContainerImageTag:
<PropertyGroup>
<ContainerRepository>ghcr.io/USERNAME/REPOSITORY</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
</PropertyGroup>

Начиная с .NET 8 и далее, если тег не указан, по умолчанию используется последний вариант.

Выбор другого базового образа
По умолчанию SDK использует следующие базовые образы:
- mcr.microsoft.com/dotnet/runtime-deps – для self-contained приложений;
- mcr.microsoft.com/dotnet/aspnet – для приложений ASP.NET Core;
- mcr.microsoft.com/dotnet/runtime – для других случаев.

Вы можете использовать образ меньшего размера или другой образ:
xml 
<PropertyGroup>
<!-- Используем образ на основе Alpine, меньшего размера -->
<ContainerBaseImage>mcr.microsoft.com/dotnet/aspnet:10.0-alpine</ContainerBaseImage>
</PropertyGroup>

Это также можно сделать, установив ContainerFamily в значение alpine, а остальное определится автоматически.

Настройка портов
Для веб-приложений по умолчанию используются открытые порты 8080 и 8081 для HTTP и HTTPS. Они определяются из переменных среды ASP.NET Core (ASPNETCORE_URLS, ASPNETCORE_HTTP_PORT, ASPNETCORE_HTTPS_PORT). Атрибут Type может быть tcp или udp:
<PropertyGroup>
<ContainerPort Include="8080" Type="tcp" />
<ContainerPort Include="8081" Type="tcp" />
</PropertyGroup>


Публикация в реестр контейнеров
Локальная публикация полезна для разработки, но для развёртывания потребуется отправить изменения в реестр. Вы можете указать целевой реестр во время публикации.

Вот пример публикации в реестр контейнеров GitHub:
dotnet publish --os linux --arch x64  /t:PublishContainer /p:ContainerRegistry=ghcr.io

Аутентификация: SDK использует ваши локальные учетные данные Docker. Убедитесь, что вы вошли в систему с помощью команды docker login перед публикацией в удалённый реестр.

Когда Dockerfile всё же нужен
Поддержка контейнеров в SDK мощная, но она не охватывает все сценарии. Dockerfile понадобится для:
- Установки системных зависимостей: если приложению нужны нативные библиотеки (например, libgdiplus для обработки изображений);
- Сложных многоэтапных сборок: нужно запускать кастомные шаги сборки;
- Компонентов, не относящихся к .NET: контейнеру нужны дополнительные сервисы или инструменты.

Но для большинства веб-API и фоновых сервисов SDK-подхода достаточно.

Источник: https://www.milanjovanovic.tech/blog/containerize-your-dotnet-applications-without-a-dockerfile
  • 👍 11
More from @netdeveloperdiary
  1. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
  2. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
  3. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  4. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  5. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  6. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →