Compila imágenes de contenedor de varias arquitecturas para Dataflow

Si usas un contenedor personalizado en Dataflow, el contenedor debe coincidir con la arquitectura de las VMs de trabajador. En este documento, se describe cómo crear contenedores de varias arquitecturas compatibles con VMs x86 y Arm.

Puedes usar la CLI de Docker o Cloud Build para compilar la imagen del contenedor.

Usa Docker para compilar la imagen

  1. Crea un Dockerfile. Usa la instrucción FROM para especificar una imagen base de varias arquitecturas.

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. Instalar la herramienta Buildx. Para comprobar si la herramienta está instalada, ejecuta el siguiente comando:

    docker buildx version
    
  3. Ejecuta el siguiente comando para crear una instancia de compilador que use el controlador docker-container. Este controlador es necesario para compilar imágenes de varias arquitecturas.

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

    La marca --use establece la instancia de compilador nueva como el compilador actual.

  4. Ejecuta el siguiente comando para configurar Docker a fin de autenticar solicitudes en Artifact Registry.

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

    Reemplaza REGION por la región del repositorio de Artifact Registry.

  5. Ejecuta el siguiente comando para compilar y enviar la imagen de contenedor a Artifact Registry:

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

    Reemplaza lo siguiente:

    • REGISTRY: el repositorio de Docker
    • IMAGE: el nombre de la imagen
    • TAG: la etiqueta de imagen

Usa Cloud Build para compilar la imagen

  1. Crea un Dockerfile. Usa la instrucción FROM para especificar una imagen base de varias arquitecturas.

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. En el mismo directorio que contiene el Dockerfile, crea un archivo llamado docker_buildx.yaml. Pega el siguiente texto:

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

    Reemplaza lo siguiente:

    • REGISTRY: el repositorio de Docker
    • IMAGE: el nombre de la imagen
    • TAG: la etiqueta de imagen
  3. Para compilar y enviar la imagen, ejecuta el comando gcloud builds submit:

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

    Reemplaza REGION por la región del servicio de Cloud Build que se usará.

Para obtener más información, consulta Compila y envía una imagen de Docker con Cloud Build.

Verifica la imagen del contenedor

  1. Abre la página Repositorios en la consola de Google Cloud.

    Abrir la página Repositorios

  2. Haz clic en el repositorio con la imagen de contenedor.

  3. Haz clic en la imagen para ver las versiones.

  4. Haz clic en una versión.

  5. Haz clic en Manifiesto.

  6. En el archivo de manifiesto, la sección platform debe tener entradas para arm64 y amd64. Por ejemplo:

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

¿Qué sigue?