构建多架构容器镜像

使用ARM架构资源部署容器通常可以节省不少成本,但也可能导致维护成本增加,您可能需要面向x86、ARM架构分别构建镜像并设置不同的Tag。通过ACR控制台配置的多架构构建任务可以帮助您简化这一过程,您可以通过一个Tag来管理多种架构的镜像。

前提条件

背景信息

  • 当仅选择一种架构时,构建推送后的Tag中只包含该架构的镜像。

  • 当同时选择多个架构时,构建系统会将多个架构的镜像以同一Tag的形式推送到镜像仓库。Docker、Containerd等客户端在镜像拉取过程中会根据客户端架构拉取远端镜像仓库内指定架构镜像。

支持的具体架构如下表所示:

操作系统

架构

是否支持

Linux

amd64

支持(为默认架构)

Linux

arm64

支持

Linux

arm/v7

支持

Linux

arm/v6

支持

Windows

amd64

暂不支持

步骤一:确定代码工程

确定需要进行镜像构建的代码仓库。作为演示,您可以选择使用下面的GoLang文件和Dockerfile文件来构造您的工程。

// 保存为 hello.go

package main
import (
        "fmt"
        "runtime"
)
func main() {
        fmt.Printf("Hello, %s!\n", runtime.GOARCH)
}
FROM golang:alpine AS builder
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN go build -o hello hello.go
FROM alpine
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/hello .
CMD ["./hello"]

步骤二:创建镜像仓库

创建镜像仓库,并绑定代码仓库,此代码仓库触发的镜像构建都会推送到该镜像仓库下。

  1. 登录容器镜像服务控制台

  2. 在顶部菜单栏,选择所需地域。

  3. 在左侧导航栏,选择实例列表

  4. 实例列表页面单击目标企业版实例。

  5. 在企业版实例管理页面选择仓库管理 > 镜像仓库

  6. 镜像仓库单击创建镜像仓库
  7. 仓库信息配置向导中设置命名空间仓库名称仓库类型镜像版本镜像加速摘要描述信息,单击下一步

  8. 代码源配置向导中设置代码源构建设置构建规则设置,单击创建镜像仓库

    参数

    说明

    代码源

    选择代码源。

    构建设置

    • 代码变更时自动构建镜像:当分支有代码提交后会自动触发构建规则。

    • 海外源智能加速:构建时会在海外机房构建,构建成功后推送到指定地域。如果您项目的Dockerfile文件需要从国外站点下载文件,但是跨境网络不稳定,您可以使用海外源智能加速

    • 不使用缓存:每次构建镜像时会强制重新拉取基础依赖镜像。开启不使用缓存,可能会增加镜像的构建时间。

    镜像仓库页面单击目标镜像仓库,您可以在镜像仓库管理页面左侧导航栏看到构建,说明镜像仓库和源代码仓库绑定成功。

步骤三:创建构建规则并选择目标架构

作为演示,在构建配置时,本文所选择的构建架构为linux/amd64和linux/arm64。

  1. 登录容器镜像服务控制台

  2. 在顶部菜单栏,选择所需地域。

  3. 在左侧导航栏,选择实例列表

  4. 实例列表页面单击目标企业版实例。

  5. 在企业版实例管理页面选择仓库管理 > 镜像仓库

  6. 镜像仓库页面单击目标仓库右侧操作列中的管理

  7. 单击左侧导航栏中的构建,在构建规则设置区域单击添加规则,在构建信息配置向导中设置参数,然后单击下一步

    参数

    说明

    类型

    设置源代码仓库的类型,可以是Branch或Tag。

    Branch/Tag

    选择或者填写Branch/Tag,支持正则规则。当正则规则为release-(?<imageTag>\w*)时,将识别release-v1源代码变更并自动构建版本为v1的镜像(不支持立即构建),更多信息,请参见附录:正则表达式-命名捕获组

    说明

    设置正则规则后仅支持系统自动构建,不支持手动立即构建。

    Dockerfile目录

    设置Dockerfile文件所在的目录。指的是相对目录,以Branch/Tag的根目录为父目录,例如您的Branch为master,您的Dockerfile文件放在master下,则您的Dockerfile目录为/。

    Dockerfile文件名

    设置Dockerfile文件名,默认为Dockerfile。

  8. 镜像版本配置向导中设置参数,单击保存,然后单击下一步

    说明

    单击新增配置,可以增加镜像版本,最多可以设置3个镜像版本。

    参数

    说明

    镜像版本

    设置镜像Tag,例如latest。支持命名捕获,例如使用Branch/Tag中捕获的内容。

    时间

    推送源代码的东八区(UTC+8)时间,有两种格式可供选择,例如20201015和202010151613。

    说明

    该参数为可选项,当选中该参数后系统仅支持自动构建,不支持手动立即构建。

    Commit ID

    最近一次推送代码的Commit ID,默认取前6位,可以滑动下方的滑块设置位数。

    说明

    该参数为可选项,当选中该参数后系统仅支持自动构建,不支持手动立即构建。

  9. 构建配置配置向导中设置构建参数,然后单击确定

    参数

    说明

    构建架构

    选择构建架构,支持并行构建,最终形成一个镜像版本对应多个架构镜像。

    构建参数

    镜像构建运行时参数,构建参数由区分大小写的键值对组成,您最多可以设置20个构建参数。您可以设置构建参数,该构建参数会修改Dockerfile文件中环境变量,使同一个Dockerfile文件呈现多种状态。

  10. 触发构建规则。

    您可以通过以下两种方式触发构建规则:

    • 构建页面构建规则设置区域单击目标构建规则操作列下的立即构建,触发构建规则。

    • 向代码仓库的master分支提交代码,触发构建规则。

    说明
    • 构建页面构建日志区域单击目标构建任务操作列的取消,可以取消构建任务。

    • 构建页面构建日志区域单击目标构建任务操作列的日志,可以查看构建过程日志。

    在左侧导航栏单击镜像版本,您可以看到构建的镜像,说明构建镜像成功。

步骤四:验证构建结果

  1. 构建完成后,在目标仓库的配置页面,单击左侧导航栏中镜像版本,查看生成的目标版本镜像。

    可以看到main版本下有linux/amd64和linux/arm64两个架构的镜像。多架构镜像

  2. 在linux/amd64和linux/arm64架构上分别验证镜像。

    • 在linux/amd64机器上执行以下命令。

      docker run --rm xxx-registry.cn-hangzhou.cr.aliyuncs.com/test/golang-test:main

      预期输出:

      Hello, amd64!
    • 在linux/arm64机器上执行以下命令。

      docker run --rm xxx-registry.cn-hangzhou.cr.aliyuncs.com/test/golang-test:main

      预期输出:

      Hello, arm!

    可以看到在不同架构的机器上,都可以使用构建的镜像。

附录:正则表达式-命名捕获组

命名捕获组

捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。捕获组有两种形式,一种是普通捕获组,另一种是命名捕获组,本文简单介绍命名捕获组。

命名捕获组的一般形式如下:

(?<name>Expression)

您可以使用命名捕获组将release-11-2-10转换成11.2.10,相应的正则表达式如下:

release-(?<major>\d*)-(?<minor>\d*)-(?<version>\d*) 

release-11-2-10匹配到这个正则表达式后,会自动把相应位置匹配到的子表达式内容存放到majorminorversion这三个组中,然后我们就可以使用下面的模板生成11.2.10这个字符串了。

${major}.${minor}.${version} 

相关文档

若您希望在本地构建多架构的容器镜像,请参见本地构建和推送多架构镜像到容器镜像服务