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


Новые возможности контейнеров для .NET 8

В этой статье описываются новые функции в контейнерах для .NET 8.

Образы контейнеров

Следующие изменения были внесены в образы контейнеров .NET для .NET 8:

Пользователь, отличный от корневого пользователя

Изображения включают пользователя non-root. Этот пользователь делает изображения совместимыми с non-root. Чтобы запустить как non-root, добавьте следующую строку в конце файла Dockerfile (или аналогичную инструкцию в манифестах Kubernetes):

USER app

.NET 8 добавляет переменную окружения для UID пользователя non-root, который равен 1654. Эта переменная среды полезна для теста Kubernetes runAsNonRoot, который требует, чтобы пользователь контейнера был задан с помощью UID, а не по имени. В этом dockerfile показан пример использования.

Порт по умолчанию также изменился с порта 80 на 8080. Для поддержки этого изменения новая переменная среды ASPNETCORE_HTTP_PORTS доступна, чтобы упростить изменение портов. Переменная принимает список портов, который проще, чем формат, необходимый для ASPNETCORE_URLS. Если вы измените порт обратно на порт 80 с помощью одной из этих переменных, вы не сможете работать как non-root.

Дополнительные сведения см. в разделе Порт по умолчанию ASP.NET Core изменен с 80 на 8080 и Новый пользователь 'app' без прав суперпользователя в образах Linux.

Debian 12

Теперь образы контейнеров используют Debian 12 (Bookworm). Debian — это дистрибутив Linux по умолчанию в образах контейнеров .NET.

Дополнительные сведения см. в разделе Образы контейнеров Debian, обновленные до Debian 12.

Отточенные образы Ubuntu

Доступны образы Chiseled Ubuntu для .NET 8. Хиселированные изображения имеют уменьшенную атакуемую поверхность, потому что они ультра-маленькие, не имеют диспетчера пакетов или оболочки, и non-root. Этот тип образа предназначен для разработчиков, которые хотят воспользоваться преимуществами аппаратных вычислений.

Хиселированные изображения по умолчанию не поддерживают глобализацию. предоставляются изображения extra, в том числе пакеты icu и tzdata.

Дополнительные сведения о глобализации и контейнерах см. в тестовом приложении по глобализации .

Создание мультиплатформенных образов контейнеров

Docker поддерживает использование и создание многоплатформенных образов , которые работают в нескольких средах. .NET 8 представляет новый шаблон, позволяющий смешивать и сопоставлять архитектуры с создаваемыми образами .NET. Например, если вы используете macOS и хотите нацелиться на облачную службу x64 в Azure, вы можете создать образ с помощью переключателя --platform следующим образом:

docker build --pull -t app --platform linux/amd64

Пакет SDK для .NET теперь поддерживает значения $TARGETARCH и аргумент -a при восстановлении. В следующем фрагменте кода показан пример:

RUN dotnet restore -a $TARGETARCH

# Copy everything else and build app.
COPY aspnetapp/. .
RUN dotnet publish -a $TARGETARCH --self-contained false --no-restore -o /app

Дополнительные сведения см. в записи блога Улучшение поддержки многоплатформенных контейнеров.

композитные изображения ASP.NET

В рамках усилий по повышению производительности контейнеризации новые ASP.NET образы Docker доступны с составной версией среды выполнения. Этот композит создается путем компиляции нескольких сборок CIL в один готовый выходной двоичный файл (R2R). Так как эти сборки внедрены в один образ, jitting занимает меньше времени, а производительность запуска приложений улучшается. Другое большое преимущество составного по сравнению с обычным ASP.NET образа заключается в том, что составные образы имеют меньший размер на диске.

Есть предостережение, о котором стоит помнить. Поскольку композиты включают в себя несколько сборок, объединенных в единую, они обладают более тесной связью версий. Приложения не могут использовать пользовательские версии платформы или ASP.NET двоичные файлы.

Композитные изображения доступны для платформ Alpine Linux, Ubuntu ("jammy") Chiseled и Mariner Distroless из репозитория mcr.microsoft.com/dotnet/aspnet. Теги перечислены с суффиксом -composite на странице ASP.NET Docker .

Публикация контейнеров

Созданные образы по умолчанию

dotnet publish может создавать образы контейнеров. По умолчанию он создает non-root образы, что помогает приложениям оставаться безопасными по умолчанию. Измените этот параметр по умолчанию в любое время, установив свойство ContainerUser, например, с помощью root.

Теперь тег выходного контейнера по умолчанию latest. Это значение по умолчанию соответствует другим инструментам в пространстве контейнеров и упрощает использование контейнеров во внутренних циклах разработки.

Производительность и совместимость

.NET 8 улучшила производительность при отправке контейнеров в удаленные реестры, особенно в реестры Azure. Ускорение достигается за счет отправки слоев в одной операции и использования более надежного механизма сегментирования для реестров, которые не поддерживают атомарные загрузки.

Эти улучшения также означают, что поддерживаются дополнительные реестры: Harbor, Artifactory, Quay.io и Podman.

Аутентификация

.NET 8 добавляет поддержку аутентификации обмена токенами OAuth (Управляемое удостоверение Azure) при отправке контейнеров в реестры. Эта поддержка означает, что теперь вы можете отправлять реестры, такие как Реестр контейнеров Azure, без ошибок проверки подлинности. В следующих командах показан пример потока публикации:

> az acr login -n <your registry name>
> dotnet publish -r linux-x64 -p PublishProfile=DefaultContainer

Дополнительные сведения о контейнеризации приложений .NET см. в разделе Контейнеризация приложения .NET с помощью dotnet publish.

Публикация в архиве tar.gz

Начиная с .NET 8, вы можете создать контейнер непосредственно в качестве архива tar.gz. Эта функция полезна, если рабочий процесс не прост и требует, чтобы вы, например, запустите средство сканирования по изображениям, прежде чем отправлять их. После создания архива его можно переместить, проверить или загрузить его в локальную цепочку инструментов Docker.

Чтобы опубликовать в архиве, добавьте свойство ContainerArchiveOutputPath в команду dotnet publish, например:

dotnet publish \
  -p PublishProfile=DefaultContainer \
  -p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz

Можно указать имя папки или путь с определенным именем файла.

См. также