为 Dataflow 构建多架构容器映像

如果您在 Dataflow 中使用自定义容器,则该容器必须与工作器虚拟机的架构匹配。本文档介绍了如何创建与 x86 和 Arm 虚拟机都兼容的多架构容器。

您可以使用 Docker CLI 或 Cloud Build 来构建容器映像。

使用 Docker 构建映像

  1. 创建 Dockerfile。使用 FROM 指令指定多架构基础映像。

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. 安装 Buildx 工具。如需检查该工具是否已安装,请运行以下命令:

    docker buildx version
    
  3. 运行以下命令以创建使用 docker-container 驱动程序的构建器实例。此驱动程序是构建多架构映像所必需的。

    docker buildx create --driver=docker-container --use
    

    --use 标志用于将新的构建器实例设置为当前构建器。

  4. 运行以下命令配置 Docker,以对 Artifact Registry 的请求进行身份验证。

    gcloud auth configure-docker REGION-docker.pkg.dev
    

    REGION 替换为 Artifact Registry 制品库的区域。

  5. 运行以下命令以构建容器映像并将其推送到 Artifact Registry:

    docker buildx build \
      --platform=linux/amd64,linux/arm64 \
      -t REGISTRY/IMAGE:TAG  \
      --push .
    

    请替换以下内容:

    • REGISTRY:Docker 制品库
    • IMAGE:映像名称
    • TAG:映像标记

使用 Cloud Build 构建映像

  1. 创建 Dockerfile。使用 FROM 指令指定多架构基础映像。

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. 在 Dockerfile 所在的目录中,创建一个名为 docker_buildx.yaml 的文件。粘贴以下文本:

    steps:
    - name: 'docker'
      args: ['buildx', 'create', '--driver', 'docker-container', '--name', 'container', '--use']
    - name: 'docker'
      args: ['buildx', 'build', '--platform', 'linux/amd64,linux/arm64', '-t', 'REGISTRY/IMAGE:TAG', '--push', '.']
    

    请替换以下内容:

    • REGISTRY:Docker 制品库
    • IMAGE:映像名称
    • TAG:映像标记
  3. 如需构建并推送映像,请运行 gcloud builds submit 命令

    gcloud builds submit --region=REGION --config docker_buildx.yaml
    

    REGION 替换为要使用的 Cloud Build 服务的区域。

如需了解详情,请参阅使用 Cloud Build 构建和推送 Docker 映像

验证容器映像

  1. 打开 Google Cloud 控制台中的制品库页面。

    打开“代码库”页面

  2. 点击包含容器映像的制品库。

  3. 点击映像以查看其版本。

  4. 点击一个版本。

  5. 点击清单

  6. 在清单文件中,platform 部分应包含 arm64amd64 的条目。例如:

      {
        "schemaVersion": 2,
        "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
        "manifests": [
            {
              "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
              "digest": "sha256:441d5438885049e2b388523a8cb5b77ea829c3c3f53326fb221fe185abd67f07",
              "size": 3074,
              "platform": {
                  "architecture": "amd64",
                  "os": "linux"
              }
            },
            {
              "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
              "digest": "sha256:d3b98b0f8f3f555f5453c79b240bd2b862d4f52d853fe81bae55f01a663de29c",
              "size": 3073,
              "platform": {
                  "architecture": "arm64",
                  "os": "linux"
              }
            }
        ]
      }
    

后续步骤