.NET 8 容器中的新增功能

本文介绍适用于 .NET 8 的容器中的新功能。

容器映像

对 .NET 8 的 .NET 容器映像进行了以下更改:

非根用户

映像包括一个 non-root 用户。 该用户使映像具有 non-root 功能。 若要以 non-root身份运行,请在 Dockerfile 末尾添加以下行(或在 Kubernetes 配置文件中添加类似的指令):

USER app

.NET 8 为 non-root 用户的 UID 添加环境变量,即 1654。 此环境变量适用于 Kubernetes runAsNonRoot 测试,这要求通过 UID 而不是按名称设置容器用户。 此 dockerfile 显示了示例用法。

默认端口也从端口 80 更改为 8080。 为了支持此更改,可以使用新的环境变量 ASPNETCORE_HTTP_PORTS,以便更轻松地更改端口。 该变量接受端口列表,该列表比 ASPNETCORE_URLS所需的格式简单。 如果使用其中一个变量将端口更改回 80,则无法运行为 non-root

有关详细信息,请参阅 默认 ASP.NET 核心端口从 80 更改为 8080Linux 映像中新的非根“应用”用户

Debian 12

容器映像现在使用 Debian 12 (Bookworm)。 Debian 是 .NET 容器映像中的默认 Linux 发行版。

有关详细信息,请参阅升级到 Debian 12 的 debian 容器映像

Chiseled Ubuntu 映像

精简的 Ubuntu 镜像 可用于 .NET 8。 Chiseled 映像的受攻击面较小,因为它们超级小,没有包管理器或 shell,并且是 non-root。 此类映像适用于希望获得设备式计算优势的开发人员。

默认情况下,雕刻图像不支持全球化。 提供 extra 映像,包括 icutzdata 包。

有关全球化和容器的详细信息,请参阅 全球化测试应用

生成多平台容器映像

Docker 支持使用和构建可跨多个环境工作的多平台映像。 .NET 8 引入了一种新的模式,使你可以将体系结构与生成的 .NET 映像混合和匹配。 例如,如果使用的是 macOS 并希望将 Azure 中的 x64 云服务作为目标,则可以使用 --platform 开关构建映像,如下所示:

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

.NET SDK 现在支持还原时 $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)输出二进制文件生成的。 由于这些程序集嵌入到单个映像中,因此抖动需要更少的时间,并且应用的启动性能会提高。 复合图像在常规 ASP.NET 图像上的另一大优点是,复合图像的磁盘大小较小。

需要注意的事项。 由于复合映像将多个程序集嵌入到一个程序集中,因此它们的版本耦合更紧密。 应用不能使用框架的自定义版本或 ASP.NET 二进制文件。

复合映像可用于来自 mcr.microsoft.com/dotnet/aspnet 存储库的 Alpine Linux、Ubuntu ("jammy") Chiseled 和 Mariner Distroless 平台。 标记在 ASP.NET Docker 页上以 -composite 后缀列出。

容器发布

生成的映像默认值

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 应用容器化,请参阅使用 dotnet publish 容器化 .NET 应用

发布到 tar.gz 存档

从 .NET 8 开始,可以直接创建容器作为 tar.gz 存档。 如果你的工作流程比较复杂,需要你在推送图像之前对它们进行扫描,此功能非常有用。 创建存档后,可以移动存档、扫描存档或将其加载到本地 Docker 工具链中。

若要发布到存档,请将 ContainerArchiveOutputPath 属性添加到 dotnet publish 命令,例如:

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

可以指定文件夹名称或具有特定文件名的路径。

另请参阅