使用Docker buildx 为 .NET 构建多平台镜像

使用,docker,buildx,net,构建,平台,镜像 · 浏览次数 : 136

小编点评

**NET 团队博客文章《改进多平台容器支持》** 文章介绍了 .NET 7 以上版本中新的 `buildx` 工具,它可以帮助用户轻松构建多平台的 Docker 镜像。 **主要内容:** * **什么是 buildx?** - buildx 是 Docker 官方提供的构建工具,可以帮助用户快速、高效地构建 Docker 镜像。 * **使用 buildx 构建跨平台镜像** - 需要创建一个 builder,它可以翻译为「构建器」。 - 使用 `docker buildx ls` 命令查看 builder 列表。 * **构建跨平台镜像的步骤** - 创建一个 `Dockerfile.alpine-composite` 文件。 - 将 `FROM` 语句指定目标平台。 - 使用 `COPY` 语句复制应用程序代码、配置文件和库到镜像中。 - 使用 `RUN` 语句运行应用程序代码。 - 使用 `RUN` 语句配置环境变量。 * **示例 Dockerfile.alpine-composite 文件** ```dockerfile.alpine-composite FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build COPY csproj && restore -a $TARGETARCHWORKDIR . COPY aspnetapp/*.csproj . RUN dotnet restore -a $TARGETARCH COPY and publish app and libraries COPY aspnetapp/. USER $APP_UIDENTRYPOINT ["/"./aspnetapp"] ``` * **使用 buildx 的优点** - 简化镜像构建流程。 - 允许构建跨平台镜像。 - 减少构建时间。 **结论** `buildx` 是一个非常实用的工具,可以帮助开发人员轻松构建多平台的 Docker 镜像。

正文

.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 命令查看列表中具体包含的的镜像。

image

与使用Docker buildx 为 .NET 构建多平台镜像相似的内容:

使用Docker buildx 为 .NET 构建多平台镜像

.NET 团队有一篇博客 改进多平台容器支持, 详细介绍了.NET 7 以上的平台可以轻松的使用Docker buildx 工具构建多平台的镜像。 buildx 是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 buildx,用

[转帖]docker使用buildx构建多平台(x86,arm64)构架镜像

https://blog.csdn.net/atzqtzq/article/details/128583331 配置文件激活buildx docker目前使用版本为Server Version: 20.10.7,添加配置支持buildx docker版本较低时,请升级docker版本 $ vim /

使用buildx在x86机器上面编译arm64架构的Docker镜像

buildx 多架构编译 安装docker 下载docker 下载buildx 安装架构支持 docker run --privileged --rm tonistiigi/binfmt --install all 创建一个自己的空间 buildx create --use --name mybui

使用 docker 打包构建部署 Vue 项目,一劳永逸解决node-sass安装问题

> 文章源于 Jenkins 构建 Vue 项目失败,然后就把 node_modules 删了重新构建发现 node-sass 安装不上了,折腾一天终于可以稳定构建了。 > 犹记得从学 node 的第一天,就被 node-sass 折磨了一整天,后面本地没问题了然后服务器开始折磨了,这次又遇到,尝试

Asp-Net-Core开发笔记:FrameworkDependent搭配docker部署

## 前言 之前我写过一篇使用 docker 部署 AspNetCore 应用的文章,这种方式搭配 CICD 非常方便, build 之后 push 到私有的 dockerhub ,在生产服务器上 pull 下来镜像就可以直接运行了。 然而,有时需要一种更传统的部署方式,比如在本地打包可执行文件之后

使用docker搭建ELK分布式日志同步方案

ELK作为业界最常用日志同步方案,我们今天尝试一下使用docker快速搭建一套ELK方案。ELK使用国内加速源拉取的镜像比较旧,有条件的朋友可以拉取官网的源。elasticsearch作为日志储存库(数据库),kibana的作用通过elasticsearch的API接口调取其中数据作可视化分析,lo

使用Docker安装Odoo 17(非Docker Compose)

使用Docker安装Odoo 17(非Docker Compose) 前言 最近在学习Odoo,先是windows 安装企业版,多年不用windows的服务器操作系统,一看windows的ECS那么贵就想折腾一下用linux服务器来跑Odoo社区版.于是开始实践,这篇文件只记录结果。其中趟坑的滋味暂

使用 Docker 部署 WebTop 运行 Linux 系统

1)项目介绍 GitHub:https://github.com/linuxserver/docker-webtop WebTop 它是一个基于 Linux ( Ubuntu 和 Alpine 两种版本)的轻量级容器,具有在浏览器中运行的完整桌面环境,具有基本的窗口管理器、像素完美的渲染分辨率、音频

使用 Docker 部署 VS Code in The Browser

1)介绍 GitHub:https://github.com/coder/code-server 在日常学习工作中,Vscode 已成为我们首选的代码编辑器。然而,其局限性在于当我们从家到公司移动时,难以保持连续的编码体验。针对这一痛点,虽然市面上已有如 Visual Studio Codespac

使用 Docker 部署 TaleBook 私人书籍管理系统

1)项目介绍 GitHub:https://github.com/talebook/talebook Talebook 是一个简洁但强大的私人书籍管理系统。它基于 Calibre 项目构建,具备书籍管理、在线阅读与推送、用户管理、SSO 登录、从百度/豆瓣拉取书籍信息等功能。 友情提醒: 个人是不允