為 Dataflow 建構多架構容器映像檔

如果您在 Dataflow 中使用自訂容器,容器必須與工作站 VM 的架構相符。本文說明如何建立與 x86 和 Arm VM 相容的多架構容器。

您可以使用 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 控制台中開啟「Repositories」(存放區) 頁面。

    開啟「存放區」頁面

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

後續步驟