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-Befehlszeile 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. Installieren Sie das Buildx-Tool. 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 mit mehreren 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 in die 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 wie die Dockerfile 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 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