本地构建和推送多架构镜像到容器镜像服务

使用ARM架构资源部署容器通常可以节省不少成本,但也可能导致维护成本增加,您可能需要面向x86、ARM架构分别构建镜像并设置不同的Tag。您可以使用docker buildx来构建多架构镜像,并通过docker manifest实现一个Tag管理多架构的容器镜像。

前提条件

  • 创建容器镜像服务ACR企业版实例。具体操作,请参见创建企业版实例

  • 在本地安装Docker客户端。具体操作,请参见安装Docker

从Dockerfile构建多架构镜像

  1. 本文以Java Maven项目为例,在Java Maven项目中新建Dockerfile文件,并在文件中添加如下内容。

    #First stage: complete build environment
    FROM maven:3.5.0-jdk-8-alpine AS builder
    
    # add pom.xml and source code
    ADD ./pom.xml pom.xml
    ADD ./src src/
    
    # package jar
    RUN mvn clean package
    
    # Second stage: minimal runtime environment
    From openjdk:8-jre-alpine
    
    # copy jar from the first stage
    COPY --from=builder target/my-app-1.0-SNAPSHOT.jar my-app-1.0-SNAPSHOT.jar
    
    EXPOSE 8080
    
    CMD ["java", "-jar", "my-app-1.0-SNAPSHOT.jar"]
  2. 在Java Maven项目所在的目录下打开本地终端,执行如下命令。

    1. 执行如下命令,关闭docker buildx的Provenance attestations选项。

      export BUILDX_NO_DEFAULT_ATTESTATIONS=1
    2. 执行如下命令,构建多架构镜像。

      docker buildx build . -t acr-test-registry.cn-hangzhou.cr.aliyuncs.com/test/test:multi  --platform linux/amd64,linux/arm64 --push

      执行该命令后,将在本地构建出Amd64、Arm64两种平台的容器镜像,并将其推送到容器镜像仓库中。

    说明

    执行Docker Push需要提前通过Docker Login登录目标仓库。例如:docker login --username=xxx acr-test-registry.cn-hangzhou.cr.aliyuncs.com

从已有镜像中创建多架构镜像

本文以您拥有两个单架构镜像,且希望使用这两个单架构镜像创建出一个多架构镜像为例。

  1. 运行docker tag,重新每个单架构镜像打上标记,并将其推送至容器镜像服务企业版实例。如下以一个架构为ARM64和一个架构为AMD64的单架构Nginx镜像为例。

    docker tag nginx:arm64 acr-test-registry.cn-hangzhou.cr.aliyuncs.com/multi-arch/nginx:arm64
    docker push acr-test-registry.cn-hangzhou.cr.aliyuncs.com/multi-arch/nginx:arm64
    
    docker tag nginx:amd64 acr-test-registry.cn-hangzhou.cr.aliyuncs.com/multi-arch/nginx:amd64
    docker push acr-test-registry.cn-hangzhou.cr.aliyuncs.com/multi-arch/nginx:amd64
  2. 运行docker manifest create创建一个Manifest List,将1中的镜像合并到一个多架构镜像中。

    docker manifest create acr-test-registry.cn-hangzhou.cr.aliyuncs.com/multi-arch/nginx:multi \
     acr-test-registry.cn-hangzhou.cr.aliyuncs.com/multi-arch/nginx:arm64 \
     acr-test-registry.cn-hangzhou.cr.aliyuncs.com/multi-arch/nginx:amd64
  3. 运行docker manifest push将Manifest List送到容器镜像服务企业版实例中。

    docker manifest push acr-test-registry.cn-hangzhou.cr.aliyuncs.com/multi-arch/nginx:multi

相关文档

您也可以通过容器镜像服务ACR控制台配置并在云端运行多架构镜像构建任务,请参见构建多架构容器镜像