.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 更改为 8080,Linux 映像中新的非根“应用”用户。
Debian 12
容器映像现在使用 Debian 12 (Bookworm)。 Debian 是 .NET 容器映像中的默认 Linux 发行版。
有关详细信息,请参阅升级到 Debian 12 的 debian 容器映像。
Chiseled Ubuntu 映像
精简的 Ubuntu 镜像 可用于 .NET 8。 Chiseled 映像的受攻击面较小,因为它们超级小,没有包管理器或 shell,并且是 non-root
。 此类映像适用于希望获得设备式计算优势的开发人员。
默认情况下,雕刻图像不支持全球化。 提供 extra
映像,包括 icu
和 tzdata
包。
有关全球化和容器的详细信息,请参阅 全球化测试应用。
生成多平台容器映像
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
可以指定文件夹名称或具有特定文件名的路径。
另请参阅
- .NET 8 中的新增功能