构建多平台支持的 .NET 容器镜像

程序员有二十年2024-04-14 12:41:34  99

Intro

最近看到有朋友在尝试在 arm 上支持的 docker 镜像

刚好之前对 dotnet-exec 的镜像添加了多平台的支持,之前仅支持 x64 的平台,新增了对于 arm 的支持,于是想分享一下如何针对 Dockerfile 改造以支持多平台,之前有一篇官方博客介绍了多平台的容器支持,可以参考文末的参考链接,希望对大家有所帮助

Sample

多平台构建 Dockerfile 示例

FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0-preview-alpine AS build-env

ARG TARGETARCH

WORKDIR /app

COPY ./src/ ./src/

COPY ./build/ ./build/

COPY ./Directory.Build.props ./

COPY ./Directory.Build.targets ./

COPY ./Directory.Packages.props ./

WORKDIR /app/src/dotnet-exec/

ENV HUSKY=0

RUN dotnet publish -f net9.0 -a $TARGETARCH -o /app/out/

FROM mcr.microsoft.com/dotnet/runtime:9.0-preview-alpine AS final

LABEL Maintainer="WeihanLi"

LABEL Repository="https://github.com/WeihanLi/dotnet-exec"

WORKDIR /app

COPY --from=build-env /app/out/ ./

ENV PATH="/app:${PATH}"

RUN chmod +x /app/dotnet-exec

ENTRYPOINT [ "/app/dotnet-exec" ]

CMD [ "--help" ]

和之前的 Dockerfile相比,主要变化有两点:

指定 sdk 镜像时增加了 --platform=$BUILDPLATFORM,这里 platform 指定的是要拉取镜像的架构,默认是本机的架构,比如 amd64 的架构默认 platform 是 linux/amd64, 我们也可以手动指定 arm64 来构建 arm64 架构的镜像

dotnet publish 的时候指定了 -a $TARGETARCH ,对于 platform 是 linux/amd64 的情况,TARGETARCH 会是 amd64

BUILDPLATFORM 和 TARGETARCH 均是 docker build 时的内置变量,详见 docker 文档 https://docs.docker.com/build/building/variables/#multi-platform-build-arguments

我们在使用 docker build 的时候可以指定 platform 参数

docker build -t multi-arch-sample --platform linux/arm64 .

也可以一次指定多个架构

docker buildx build --pull -t aspnetapp -f Dockerfile --platform linux/arm64,linux/arm,linux/amd64 .

Github Action Sample

接着看一个 github action yaml 的示例

name:docker

on:

workflow_dispatch:

# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release

release:

types:[published]

push:

branches:

-"main"

paths:

-'Dockerfile'

-'Directory.*'

-'src/**'

-'build/**'

-'.github/workflows/docker.yml'

env:

DOCKER_HUB_USERNAME:"weihanli"

ContainerPlatforms:"linux/amd64,linux/arm64,linux/arm"

jobs:

docker-build:

if:github.repository=='WeihanLi/dotnet-exec'

runs-on:ubuntu-latest

steps:

-name:CheckOut

uses:actions/checkout@v4

-name:SetupQEMU

uses:docker/setup-qemu-action@v3

-name:SetupDockerBuildx

uses:docker/setup-buildx-action@v3

-name:LogintoDockerHub

uses:docker/login-action@v3

with:

username:${{ env.DOCKER_HUB_USERNAME }}

password:${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

-name:Buildandpushlatest

id:docker_build_latest

uses:docker/build-push-action@v5

with:

# https://docs.github.com/en/actions/learn-github-actions/contexts#github-context

context:./

file:./Dockerfile

push:true

tags:${{ env.DOCKER_HUB_USERNAME }}/dotnet-exec:latest

platforms:${{ env.ContainerPlatforms }}

这里首先我们需要设置 qemu 以支持模拟多种架构,这样才能够实现支持本地之外的架构构建,其次我们需要设置 docker buildx 以比较方便地构建多平台架构支持镜像,最后在 build 的时候指定需要的 platform

References

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/217098.html
0
随机主题
美锦能源下跌5.99%, 报5.49元/股掌握牛头滚,轻松应对屏风马两头蛇#象棋云辟谣|成都熊猫基地14号圈舍环境恶劣, 场馆设施不达标? 系谣言火箭的控球简直是登峰造极,乱局长台精准入手,面对高难度局面彻底是杀疯了参展机构增加2419家! 几组数据看深圳文博会蓬勃生机没想到, 5月还未结束, 33岁金晨就以这种形式翻车了反制说到做到, 中方拉长清单, 外交部宣布出手, 美国政客财路被断朱一珺新搭档孙文骏 孙文骏(石宇奇教练孙俊之子)50多万的奥迪SUV降价超22万元, 车长4米9马力313匹值不值小鹏汽车或迎全新营销副总裁! 传一加手机营销负责人将加入夏威夷是如何变成美国的第五十个州的,美国的第一次干涉别国内政「王阳明」——文成贤圣王阳明,千载光辉照后人#致每一个热爱生活的你4-1, 6-3! 曼城太强, 7次吊打曼联, 足总杯151亿决战, 央视不直播年轻人的第1台插混SUV, 星途追风C-DM奇瑞又搞大事了, 众筹决定价格?底盘革新之作——问界新M7 Max焕新版即将正式上市重磅! 加拿大启动偏远和法语社区移民试点! 地区扩大到15个【每日精选】周四精选2串1: 尼美根往绩不落下风 前进之鹰出现慢热迹象KPL春季赛最佳阵容有变? AG300W卖壶神, KPL大瓜: 九尾不打夏季赛客户生病,投保的保险没有理赔,去客户家道个歉明天会更好, 尤文多位球员开启续约计划, 门将补强盯上国米青训
最新回复(0)