Crear imágenes de contenedor de varias arquitecturas para Dataflow

Si usas un contenedor personalizado en Dataflow, este debe coincidir con la arquitectura de las VMs de los trabajadores. En este documento se describe cómo crear contenedores de varias arquitecturas que sean compatibles con máquinas virtuales x86 y Arm.

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

Usar 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. Instala 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 define la nueva instancia del compilador como el compilador actual.

  4. Ejecuta el siguiente comando para configurar Docker de forma que autentique las solicitudes a Artifact Registry.

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

    Sustituye 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 .
    

    Haz los cambios siguientes:

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

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

    Haz los cambios siguientes:

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

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

    Sustituye REGION por la región del servicio Cloud Build que quieras usar.

Para obtener más información, consulta el artículo sobre cómo compilar y enviar una imagen Docker con Cloud Build.

Verificar la imagen de contenedor

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

    Abre la página Repositorios.

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

  3. Haz clic en la imagen para ver sus 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"
              }
            }
        ]
      }
    

Siguientes pasos