使用Docker buildx 为 .NET 构建多平台镜像
.NET 团队有一篇博客 改进多平台容器支持, 详细介绍了.NET 7 以上的平台可以轻松的使用Docker buildx 工具构建多平台的镜像。 buildx
是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 buildx
,用户可以在单个命令中构建多种架构的镜像,例如 x86 和 ARM 架构,而无需手动操作多个构建命令。此外,buildx
还支持 Dockerfile 的多阶段构建和缓存,这可以大大提高镜像构建的效率和速度。
buildx
是一个管理 Docker 构建的 CLI 插件,底层使用 BuildKit 扩展了 Docker 构建功能。要使用buildx 需要 Docker Engine 版本号大于等于 19.03,如果你使用的是 Docker Desktop,则默认安装了 buildx
。可以使用 docker buildx version
命令查看安装版本,得到以下类似输出,证明已经安装过了。
❯❯ docker buildx version
github.com/docker/buildx v0.11.2-desktop.1 986ab6afe790e25f022969a18bc0111cff170bc2
要使用 buildx
构建跨平台镜像,我们需要先创建一个 builder
,可以翻译为「构建器」。
❯❯ docker buildx create --use
使用 docker buildx ls
命令可以查看 builder
列表:
❯❯ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
agitated_tesla docker-container
agitated_tesla0 npipe:////./pipe/docker_engine inactive
elegant_mclean * docker-container
elegant_mclean0 npipe:////./pipe/docker_engine running v0.12.2 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default docker
default default running v0.11.6+0a15675913b7 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux docker
desktop-linux desktop-linux running v0.11.6+0a15675913b7 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
其中 PLATFORMS
一列所展示的值 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6就是当前构建器所支持的所有平台了。
现在一些准备工作已经就绪,我们终于可以使用 builder
构建多平台镜像了。 我们以 https://github.com/dotnet/dotnet-docker/blob/main/samples/aspnetapp/Dockerfile.alpine-composite 为例 :
# Learn about building .NET container images:
# https://github.com/dotnet/dotnet-docker/blob/main/samples/README.md
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
ARG TARGETARCH
WORKDIR /source
# copy csproj and restore as distinct layers
COPY aspnetapp/*.csproj .
RUN dotnet restore -a $TARGETARCH
# copy and publish app and libraries
COPY aspnetapp/. .
RUN dotnet publish -a $TARGETARCH --no-restore -o /app
# Enable globalization and time zones:
# https://github.com/dotnet/dotnet-docker/blob/main/samples/enable-globalization.md
# final stage/image
FROM mcr.microsoft.com/dotnet/nightly/aspnet:8.0-alpine-composite
WORKDIR /app
COPY --from=build /app .
USER $APP_UID
ENTRYPOINT ["./aspnetapp"]
Docker file 里面加上了 --platform=$BUILDPLATFORM 是关键:
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
Dockerfile 格式允许为语句指定开关,并使用内置函数提供值。在这种情况下,我们说应该始终使用(又名本地机器架构)。在 Arm64 计算机上,这将始终是 Arm64。
使用buildx 构建多平台镜像,
docker buildx build --pull -t aspnetapp -f Dockerfile.alpine-composite --platform linux/arm64,linux/arm,linux/amd64 .
docker buildx build
语法跟 docker build
一样,--platform
参数表示构建镜像的目标平台,-t
表示镜像的 Tag,.
表示上下文为当前目录。
唯一不同的是对 --platform
参数的支持,docker build
的 --platform
参数只支持传递一个平台信息,如 --platform linux/arm64
,也就是一次只能构建单个平台的镜像。
而使用 docker buildx build
构建镜像则支持同时传递多个平台信息,中间使用英文逗号分隔,这样就实现了只用一条命令便可以构建跨平台镜像的功能。
在这里,我们正在构建三种架构。在某些环境中,您还可以仅指定体系结构作为简写,避免重复“linux”。
使用该命令,你将看到以下警告。
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
这条警告提示我们没有为 docker-container
驱动程序指定输出,生成结果将只会保留在构建缓存中,使用 --push
可以将镜像推送到 Docker Hub 远程仓库,使用 --load
可以将镜像保存在本地(仅在一次面向一个体系结构时才有效)。
查看 manifest
列表
docker buildx build –pull 推送的是多个平台的镜像合并为一个镜像的manifest ,可以通过docker manifest inspect 命令查看列表中具体包含的的镜像。
欢迎大家扫描下面二维码成为我的客户,扶你上云

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
2021-10-15 单体应用 适合采用 dapr 构建吗?
2012-10-15 虚拟串口工具_com0com
2011-10-15 作业调度框架 Quartz.NET 2.0 beta 发布
2008-10-15 Microsoft Silverlight 2正式版
2006-10-15 Visual Studio 2005的各个版本
2006-10-15 ASP.NET 2.0 主题文件下载
2005-10-15 IBatisNet之获取和操作SQL语句