Créer des images de conteneurs multi-architectures pour Dataflow

Si vous utilisez un conteneur personnalisé dans Dataflow, celui-ci doit correspondre à l'architecture des VM de nœud de calcul. Ce document explique comment créer des conteneurs multi-architectures compatibles avec les VM x86 et basées sur l'architecture ARM.

Vous pouvez créer l'image de conteneur à l'aide de la CLI Docker ou de Cloud Build.

Utiliser Docker pour créer l'image

  1. Créez un fichier Dockerfile. Utilisez l'instruction FROM pour spécifier une image de base multi-architecture.

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. Installez l'outil Buildx. Pour vérifier si l'outil est installé, exécutez la commande suivante :

    docker buildx version
    
  3. Exécutez la commande suivante pour créer une instance de compilateur qui utilise le pilote docker-container. Ce pilote est requis pour créer des images multi-architectures.

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

    L'option --use définit la nouvelle instance de compilateur en tant que compilateur actuel.

  4. Exécutez la commande suivante pour configurer Docker afin d'authentifier les requêtes envoyées à Artifact Registry.

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

    Remplacez REGION par la région du dépôt Artifact Registry.

  5. Exécutez la commande suivante pour créer et transférer l'image de conteneur dans Artifact Registry :

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

    Remplacez les éléments suivants :

    • REGISTRY : dépôt Docker
    • IMAGE : nom de l'image
    • TAG : tag de l'image

Utiliser Cloud Build pour créer l'image

  1. Créez un fichier Dockerfile. Utilisez l'instruction FROM pour spécifier une image de base multi-architecture.

    FROM apache/beam_python3.10_sdk:2.50.0
    
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
    
  2. Dans le répertoire contenant le Dockerfile, créez un fichier nommé docker_buildx.yaml. Collez le texte suivant :

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

    Remplacez les éléments suivants :

    • REGISTRY : dépôt Docker
    • IMAGE : nom de l'image
    • TAG : tag de l'image
  3. Pour créer et transférer l'image, exécutez la commande gcloud builds submit :

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

    Remplacez REGION par la région du service Cloud Build à utiliser.

Pour en savoir plus, consultez Créer et transférer une image Docker avec Cloud Build.

Vérifier l'image de conteneur

  1. Ouvrez la page Dépôts de la console Google Cloud.

    Ouvrir la page "Dépôts"

  2. Cliquez sur le dépôt contenant l'image de conteneur.

  3. Cliquez sur l'image pour afficher ses versions.

  4. Cliquez sur une version.

  5. Cliquez sur Fichier manifeste.

  6. Dans le fichier manifeste, la section platform doit contenir des entrées pour arm64 et amd64. Exemple :

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

Étapes suivantes