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


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

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

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

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

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

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

USER app

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

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

Дополнительные сведения см. в разделе "Стандартный порт" ASP.NET Core с 80 по 8080 и новый пользователь, отличный от корневого приложения, в образах Linux.

Debian 12

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

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

Образы Ubuntu

Образы 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 доступны с составной версией среды выполнения. Этот состав создается путем компиляции нескольких сборок MSIL в один готовый двоичный файл вывода (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. Ускорение происходит от отправки слоев в одной операции и для реестров, которые не поддерживают атомарные передачи, более надежный механизм блокирования.

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

Проверка подлинности

.NET 8 добавляет поддержку проверки подлинности exchange маркеров 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

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

См. также