Crea immagini container multi-architettura per Dataflow

Se utilizzi un contenitore personalizzato in Dataflow, il contenitore deve corrispondere all'architettura delle VM worker. Questo documento descrive come creare contenuti multi-architettura compatibili sia con le VM x86 sia con quelle Arm.

Puoi utilizzare l'interfaccia a riga di comando Docker o Cloud Build per creare l'immagine del contenitore.

Utilizza Docker per creare l'immagine

  1. Crea un Dockerfile. Utilizza l'istruzione FROM per specificare un'immagine di base multi-architettura.

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. Installa lo strumento Buildx. Per verificare se lo strumento è installato, esegui il seguente comando:

    docker buildx version
    
  3. Esegui il comando seguente per creare un'istanza del generatore che utilizza il driver docker-container. Questo driver è necessario per creare immagini con più architetture.

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

    Il flag --use imposta la nuova istanza del generatore come generatore corrente.

  4. Esegui il seguente comando per configurare Docker per autenticare le richieste ad Artifact Registry.

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

    Sostituisci REGION con la regione del repository Artifact Registry.

  5. Esegui il comando seguente per creare e inviare l'immagine del container ad Artifact Registry:

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

    Sostituisci quanto segue:

    • REGISTRY: il repository Docker
    • IMAGE: il nome dell'immagine
    • TAG: il tag immagine

Utilizza Cloud Build per creare l'immagine

  1. Crea un Dockerfile. Utilizza l'istruzione FROM per specificare un'immagine di base multi-architettura.

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. Nella stessa directory contenente il Dockerfile, crea un file denominato docker_buildx.yaml. Incolla il seguente testo:

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

    Sostituisci quanto segue:

    • REGISTRY: il repository Docker
    • IMAGE: il nome dell'immagine
    • TAG: il tag immagine
  3. Per creare e eseguire il push dell'immagine, esegui il comando gcloud builds submit:

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

    Sostituisci REGION con la regione del servizio Cloud Build da utilizzare.

Per ulteriori informazioni, consulta Crea ed esegui il push di un'immagine Docker con Cloud Build.

Verifica l'immagine container

  1. Apri la pagina Repository nella console Google Cloud .

    Apri la pagina Repository

  2. Fai clic sul repository con l'immagine del contenitore.

  3. Fai clic sull'immagine per visualizzarne le versioni.

  4. Fai clic su una versione.

  5. Fai clic su Manifest.

  6. Nel file manifest, la sezione platform deve contenere voci per arm64 e amd64. Ad esempio:

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

Passaggi successivi