Container-Images mit mehreren Architekturen für Dataflow erstellen

Wenn Sie in Dataflow einen benutzerdefinierten Container verwenden, muss der Container der Architektur der Worker-VMs entsprechen. In diesem Dokument wird beschrieben, wie Container mit mehreren Architekturen erstellt werden, die sowohl mit x86- als auch mit Arm-VMs kompatibel sind.

Sie können die Docker-Befehlszeile oder Cloud Build verwenden, um das Container-Image zu erstellen.

Docker zum Erstellen des Images verwenden

  1. So erstellen Sie ein Dockerfile: Verwenden Sie die Anweisung FROM, um ein Basis-Image mit mehreren Architekturen anzugeben.

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. Installieren Sie das Buildx-Tool. Führen Sie folgenden Befehl aus, um zu prüfen, ob das Tool installiert ist:

    docker buildx version
    
  3. Führen Sie den folgenden Befehl aus, um eine Builder-Instanz zu erstellen, die den Treiber docker-container verwendet. Dieser Treiber ist erforderlich, um Images mit mehreren Architekturen zu erstellen.

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

    Das Flag --use legt die neue Builder-Instanz als aktuellen Builder fest.

  4. Führen Sie den folgenden Befehl aus, um Docker für die Authentifizierung von Anfragen an Artifact Registry zu konfigurieren.

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

    Ersetzen Sie REGION durch die Region des Artifact Registry-Repositorys.

  5. Führen Sie den folgenden Befehl aus, um das Container-Image zu erstellen und per Push nach Artifact Registry zu übertragen:

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

    Ersetzen Sie Folgendes:

    • REGISTRY: das Docker-Repository
    • IMAGE: der Image-Name
    • TAG: das Image-Tag

Image mit Cloud Build erstellen

  1. So erstellen Sie ein Dockerfile: Verwenden Sie die Anweisung FROM, um ein Basis-Image mit mehreren Architekturen anzugeben.

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. Erstellen Sie im selben Verzeichnis, das auch das Dockerfile enthält, eine Datei mit dem Namen docker_buildx.yaml. Fügen Sie den folgenden Text ein:

    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', '.']
    

    Ersetzen Sie Folgendes:

    • REGISTRY: das Docker-Repository
    • IMAGE: der Image-Name
    • TAG: das Image-Tag
  3. Führen Sie den Befehl gcloud builds submit aus, um das Image zu erstellen und per Push zu übertragen:

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

    Ersetzen Sie REGION durch die Region des zu verwendenden Cloud Build-Dienstes.

Weitere Informationen finden Sie unter Docker-Image mit Cloud Build erstellen und per Push übertragen.

Container-Image prüfen

  1. Öffnen Sie in der Cloud Console die Seite Repositories.

    Zur Seite „Repositories“

  2. Klicken Sie auf das Repository mit dem Container-Image.

  3. Klicken Sie auf das Image, um seine Versionen aufzurufen.

  4. Klicken Sie auf eine Version.

  5. Klicken Sie auf Manifest.

  6. Der Abschnitt platform in der Manifestdatei sollte Einträge für arm64 und amd64 enthalten. Beispiel:

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

Nächste Schritte