Контейнеризация .NET-приложений без Dockerfile. Начало
Контейнеры стали стандартом для развёртывания современных приложений. Но если вы когда-либо писали Dockerfile, вы знаете, насколько это может быть утомительно. Нужно понимать многоэтапные сборки, выбирать правильные базовые образы, настраивать правильные порты и помнить о копировании файлов в правильном порядке. Но в принципе, без Dockerfile можно обойтись.
Начиная с .NET 7, SDK имеет встроенную поддержку публикации приложения непосредственно в образ контейнера с помощью команды dotnet publish.
Традиционный подход: Dockerfile
Сначала посмотрим, что мы заменяем. Типичный многоэтапный Dockerfile для .NET-приложения выглядит так:
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["src/MyApi/MyApi.csproj", "src/MyApi/"]
RUN dotnet restore "src/MyApi/MyApi.csproj"
COPY . .
WORKDIR "/src/src/MyApi"
RUN dotnet build "MyApi.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "MyApi.csproj" -c $BUILD_CONFIGURATION -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApi.dll"]
Это работает, но требует обучения и дополнительных затрат на обслуживание:
- нужно вручную обновлять теги базового образа;
- неправильный порядок копирования приводит к повреждению кэша сборки;
- каждому проекту нужен похожий Dockerfile;
- переключение контекста: вы пишете Docker DSL, а не код .NET.
Подход с использованием .NET SDK устраняет все это.
Включение публикации в контейнер
Если вы работаете на .NET 10, не нужно делать ничего особенного для включения публикации в контейнер. Это будет работать для приложений ASP.NET Core, фоновых сервисов и консольных приложений. Можно публиковать напрямую в образ контейнера:
dotnet publish --os linux --arch x64 /t:PublishContainer
И всё. SDK .NET выполнит следующие действия:
- соберёт приложение;
- выберет подходящий базовый образ;
- создаст образ контейнера с опубликованным результатом;
- загрузит его в ваш локальный OCI-совместимый демон (наиболее популярный вариант — Docker, но он также работает с Podman).
SDK предоставляет разумные значения по умолчанию, но часто будет требоваться настроить образ. Далее рассмотрим наиболее распространённые настройки.
Окончание следует…
Источник: https://www.milanjovanovic.tech/blog/containerize-your-dotnet-applications-without-a-dockerfile