首页 > 其他分享 >使用Docker buildx 为 .NET 构建多平台镜像

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

时间:2023-10-15 09:33:23浏览次数:37  
标签:-- NET buildx 构建 linux 镜像 docker 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 可以将镜像保存在本地(仅在一次面向一个体系结构时才有效)。

标签:--,NET,buildx,构建,linux,镜像,docker,Docker
From: https://www.cnblogs.com/shanyou/p/17765247.html

相关文章

  • 【科研03】【代码复现】TransUnet道路提取
    目录1.数据准备dataprocess2.文件更名filesrename2.1.数据更名npzrename2.2.文档更名txtrename3.代码修改codechange3.1.目录调整contents3.2.数据读取code13.2.训练参数parameterset3.2.1.目标类别numclasses3.2.2.运行轮次maxepochs3.2.3.批次传入......
  • 【科研02】【代码复现】【代码分享】TransUnet-RoadExtract 道路提取【数据预处理-ras
    目录1.数据处理dataprocess1.1.类型转换RastertoPng1.2.边缘填充Resize1.2.1.填充Resizeimage1.2.1.填充Resizelabel1.3.批量裁剪Clip1.4.波段缩减3bandsto1band1.5.筛选图像Choose1.6.转换格式Transformtonpz1.7.读取列表ReadFilesToList1.数......
  • docker配置阿里云镜像
    1.登录阿里云账号2.进入管理界面,搜索:容器镜像  1.安装/升级Docker客户端推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce2.配置镜像加速器针对Docker客户端版本大于1.10.0的用户您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器sudo......
  • Docker命令补充
    一、docker删除已停止的容器1.1、根据容器的状态,删除Exited状态的容器先停止容器、再删除镜像中的容器、最后删除none的镜像。执行命令如下:#停止容器dockerstop$(dockerps-a|grep"Exited"|awk'{print$1}')#删除容器dockerrm$(dockerps-a|grep"Exited"......
  • 轻松掌握组件启动之MongoDB:快速入门、Linux安装和Docker配置指南
    引言我们将继续深入研究组件启动专题。在之前的文章中,我们已经详细介绍了Redis的各种配置使用方法,为读者提供了全面的指导。然而,今天我们将转向另一个备受关注的数据库——MongoDB。MongoDB是一种流行的NoSQL数据库,具有强大的灵活性和可扩展性。在这篇文章中,我们将探索MongoDB的......
  • 【科研01】【代码复现】TransUnet-文件目录安排
    目录1.信息TransUnet1.1.时间opentime1.2.链接Linkgithub1.3.应用Use2.自用TransUnet2.1.目录Tree2.2.修改Change1.信息TransUnet1.1.时间opentime20211.2.链接Linkgithubhttps://github.com/Beckschen/TransUNet1.3.应用Use  本是应用于......
  • docker入门加实战—Docker镜像和Dockerfile语法
    docker入门加实战—Docker镜像和Dockerfile语法镜像镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。镜像结构我们要从0部署一个Java应用,大概流程是这样:准备Linux运行环境(java项目并不需要完整的操作......
  • Windows访问Oracle VM VirtualBox虚拟机下Linux docker
    设置网络中的NAT方式下的端口转发  配置主机端口和客体端口,客体端口设置Linuxdocker容器端口,主机端口设置windows访问docker时用到的端口。比如,Linuxdocker容器端口为80,客体端口设置为80,在windows访问时,通过localhost:主机端口,如localhost:80,就能访问。 ......
  • 论文阅读:CurveNet: Curvature-Based Multitask Learning Deep Networks for 3D Object
    CurveNet:Curvature-BasedMultitaskLearningDeepNetworksfor3DObjectRecognitionCurveNet:用于3D对象识别的基于曲率的多任务学习深度网络IEEE2021摘要:在计算机视觉领域,3D对象识别是许多实际应用中最重要的任务之一。三维卷积神经网络(CNN)已经在3D物体识别中展示了其......
  • .NET 5 Web API 中JWT详细教程:保护你的Web应用
    第一部分:理解JWTJSONWebToken(JWT)是一种在不同系统之间传递信息的安全方式。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含加密算法和令牌类型等信息,载荷包含用户的信息,签名用于验证令牌的真实性。安装必要的包在开始之前,我们需要在你的项目中添加一些必要的Nu......