为 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"
              }
            }
        ]
      }
    

后续步骤