Новые возможности контейнеров для .NET 8
В этой статье описываются новые функции в контейнерах для .NET 8.
Образы контейнеров
Следующие изменения были внесены в образы контейнеров .NET для .NET 8:
- Пользователь, отличный от корневого пользователя
- Debian 12
- Образы Ubuntu
- Создание образов контейнеров с несколькими платформами
- составные образы ASP.NET
Пользователь, отличный от корневого пользователя
Изображения включают 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.
Публикация контейнеров
- Созданные образы по умолчанию
- Производительность и совместимость
- Аутентификация
- Публикация в архиве tar.gz
Созданные образы по умолчанию
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
Можно указать имя папки или путь с определенным именем файла.