Container-Images mit mehreren Architekturen für Dataflow erstellen

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

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

Image mit Docker 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. Sie haben das Buildx-Tool installiert. Führen Sie den 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 docker-container-Treiber verwendet. Dieser Treiber ist erforderlich, um Images für mehrere Architekturen zu erstellen.

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

    Mit dem Flag --use wird die neue Builder-Instanz als aktueller Builder festgelegt.

  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 an Artifact Registry zu übertragen:

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

    Ersetzen Sie dabei Folgendes:

    • REGISTRY: das Docker-Repository
    • IMAGE: der Name des Image
    • 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 die 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 dabei Folgendes:

    • REGISTRY: das Docker-Repository
    • IMAGE: der Name des Image
    • TAG: das Image-Tag
  3. Führen Sie den gcloud builds submit-Befehl 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 Cloud Build-Dienstes, die Sie verwenden möchten.

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

Container-Image überprüfen

  1. Öffnen Sie in der Google 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