Configurer les mises à jour automatiques des images de base

Configurer les mises à jour automatiques des images de base pour Cloud Run permet à Google d'appliquer automatiquement des correctifs de sécurité au système d'exploitation et aux composants d'exécution du langage de l'image de base. Vous n'avez pas besoin de recompiler ou de redéployer votre service pour que l'image de base soit mise à jour. Aucune révision n'est créée lorsque l'image de base est mise à jour.

Pour savoir comment définir des règles de mise à jour de sécurité sur les fonctions créées à l'aide des commandes gcloud functions ou de l'API Cloud Functions v2, consultez Sécurité de l'environnement d'exécution.

Le schéma suivant montre comment le code de votre application et ses dépendances ("image de l'application") se superposent sur l'environnement d'exécution du langage, les packages de l'OS et le système d'exploitation ("image de base"). Les composants de l'image de base sont automatiquement mis à jour par Google.

Diagramme de l'image de base Cloud Run

Règles concernant les mises à jour de sécurité

  • Mises à jour automatiques : les mises à jour et les correctifs de sécurité de l'environnement d'exécution sont publiés dans de nouvelles versions de l'image d'exécution. Après une période de tests de stabilité et de fiabilité, l'environnement d'exécution mis à jour est déployé sur tous les services, ce qui évite les temps d'arrêt. Pour appliquer des correctifs de sécurité au niveau du langage, vous devrez peut-être recréer des fonctions ou des services qui utilisent des langages compilés tels que Go ou Java.

  • Lors des mises à jour de déploiement : les mises à jour et les correctifs de sécurité ne sont appliqués aux environnements d'exécution que lorsque des services sont déployés ou redéployés, sauf indication contraire. Les mises à jour sur le déploiement sont disponibles à la fois sur Cloud Run Functions (1re génération) et Cloud Run Functions.

Par défaut, les mises à jour de sécurité automatiques sont activées pour les fonctions déployées à l'aide des éléments suivants :

Configurer les mises à jour automatiques des images de base

Pour configurer les mises à jour automatiques des images de base, procédez comme suit :

  • Sélectionnez une image de base compatible avec Cloud Run.
  • Créez et déployez l'image de votre application de manière à préserver la possibilité de rebaser votre service en cours d'exécution de manière sécurisée.

Sélectionner une image de base

Une image de base est le point de départ de la plupart des workflows de développement basés sur des conteneurs. Les développeurs commencent par une image de base, sur laquelle sont superposées les bibliothèques, les fichiers binaires et les fichiers de configuration nécessaires à l'exécution de leur application.

Les buildpacks de Google Cloud publient et gèrent des images de base pour la création d'applications sans serveur. Ces images de base sont créées sur la distribution Ubuntu Linux.

Cloud Run n'est compatible qu'avec les images de base automatiques qui utilisent des images de base des buildpacks de Google Cloud.

Vous devez tenir compte des éléments suivants lorsque vous choisissez une image de base buildpacks :

  • Pile : une pile se compose d'une version de distribution Linux et de packages système, tels que OpenSSL et curl.
  • Langage : version spécifique du langage de programmation utilisé par votre application.

Consultez la section images de base de l'environnement d'exécution pour en savoir plus sur les variantes d'images de base.

Créer l'image de l'application

Les services pour lesquels les mises à jour automatiques sont activées devront fournir une image d'application qui omet les couches du système d'exploitation de base. Pour ce faire, deux moyens s'offrent à vous :

  • Utiliser le déploiement à partir de la source Cloud Run (recommandé)
  • À l'aide d'un système de compilation, copiez votre application dans une image scratch.

Déployer une fonction à partir d'une source

Vous pouvez utiliser l'option de déploiement à partir de la source de Cloud Run pour créer et déployer votre code afin que votre service soit compatible avec la réception des mises à jour automatiques. Pour ce faire, vous devez fournir l'option --base-image lorsque vous créez votre application.

Par exemple, pour déployer un service Node.js avec les mises à jour automatiques des images de base activées, utilisez la commande suivante :

gcloud run deploy \
    --source . \
    --base-image nodejs22 \
    --automatic-updates

Pour déployer une fonction, vous devez spécifier l'option --function avec le point d'entrée de la fonction à partir de votre code source.

Créer à partir de scratch

Vous pouvez également utiliser votre chaîne d'outils de compilation pour créer une image de conteneur d'application compatible avec les mises à jour automatiques des images de base.

Lorsque vous déployez un service Cloud Run avec des mises à jour automatiques des images de base, votre image de conteneur d'application est superposée à une image de conteneur de base. L'image de conteneur d'application ne doit inclure que votre application, et non le système d'exploitation ni l'environnement d'exécution, qui sont fournis dans l'image de conteneur de base.

Pour créer l'image de conteneur de l'application, procédez comme suit :

  1. Créez un fichier Dockerfile en plusieurs étapes qui :
    1. Crée l'application en utilisant une image de base appropriée avec les dépendances requises
    2. Copie les composants compilés sur une image scratch.
  2. Crée l'image du conteneur d'application et la transfère vers Artifact Registry.
  3. Déploie l'image de conteneur de l'application sur Cloud Run et spécifie une image de base.

Créer un Dockerfile en plusieurs étapes

Nous utiliserons une application Node.js pour ce guide. Ce guide n'est pas spécifique à un langage et peut être personnalisé pour votre application et votre langage.

  • Créez un fichier Dockerfile dans le répertoire racine de notre projet avec les éléments suivants :

    # This Dockerfile will produce an image that only includes the Node.js app and *not* the Node.js runtime.
    # The resulting image will not run locally. It is intended at being layered on top of a Node.js base image.
    
    FROM node:22-slim as builder
    
    # Create and change to the app directory.
    WORKDIR /usr/src/app
    
    # Copy application dependency manifests to the container image and install
    # production dependencies.
    COPY package*.json ./
    RUN npm install --only=production
    
    # Copy local code to the container image.
    COPY . ./
    
    # Copy the application source code and dependencies onto a scratch image.
    FROM scratch
    WORKDIR /workspace
    COPY --from=builder --chown=33:33 /usr/src/app/ ./
    USER 33:33
    
    # Run the web service on container startup.
    CMD [ "node", "index.js" ]
    

Ce fichier Dockerfile utilise une création en plusieurs étapes pour copier le code source et les dépendances de l'application sur une image scratch qui omet le système d'exploitation, les packages et les composants d'exécution qui seront fournis au moment de l'exécution par l'image de base gérée par Cloud Run.

Créer l'image de votre application

Créez l'image de votre application et importez-la dans Artifact Registry. Consultez la section Créer des conteneurs pour apprendre à créer un fichier Dockerfile avec Cloud Build et à l'importer dans Artifact Registry.

Déployer l'image de l'application

Vous êtes maintenant prêt à déployer l'image de votre application avec les mises à jour automatiques activées à l'aide de l'image de base la plus compatible pour votre application. L'exemple suivant utilise l'environnement d'exécution nodejs22 et la région europe-west1. Pour en savoir plus sur les variantes d'images de base, consultez Images de base de l'environnement d'exécution.

Pour en savoir plus sur les rôles et les autorisations requis, consultez la page Déployer à partir du code source.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Pour activer les mises à jour automatiques du runtime nodejs22 lors du déploiement de l'image de votre application, exécutez la commande suivante :

    gcloud run deploy SERVICE \
        --image APP_IMAGE \
        --base-image BASE_IMAGE

    Remplacez les éléments suivants :

    • SERVICE : nom du service sur lequel vous souhaitez déployer.
    • APP_IMAGE : URL de l'image de conteneur de votre application.
    • BASE_IMAGE : URL de votre image de base, par exemple nodejs22 ou europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Consultez la section Images de base de l'environnement d'exécution pour en savoir plus sur les variantes d'images de base.
  3. YAML

    1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

      gcloud run services describe SERVICE --format export > service.yaml
    2. Mettez à jour runtimeClassName et les annotations run.googleapis.com/base-images :

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: SERVICE
      spec:
        template:
          metadata:
            annotations:
              run.googleapis.com/base-images: '{"NAME":"BASE_IMAGE"}'
          spec:
            containers:
            - name: NAME
              image: APP_IMAGE
            runtimeClassName: run.googleapis.com/linux-base-image-update

      Remplacez les éléments suivants :

      • SERVICE : nom du service sur lequel vous souhaitez déployer.
      • APP_IMAGE : URL de l'image de conteneur de votre application.
      • BASE_IMAGE : URL de votre image de base (par exemple, europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22). Consultez la section Images de base de l'environnement d'exécution pour en savoir plus sur les variantes d'images de base.

    Terraform

    Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

    Ajoutez les éléments suivants à une ressource google_cloud_run_v2_service dans votre configuration Terraform :

    resource "google_cloud_run_v2_service" "default" {
      provider = google-beta
      name     = "SERVICE"
      location = "REGION"
    
      template {
        containers {
          image = "IMAGE_URL"
          base_image_uri = "BASE_IMAGE"
        }
      }
    }
    

    Remplacez les éléments suivants :

    • SERVICE : nom du service sur lequel vous souhaitez déployer.
    • REGION : région Google Cloud .
    • IMAGE_URL : référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL est au format LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
    • BASE_IMAGE : URL de votre image de base (par exemple, us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22). Consultez la section Images de base de l'environnement d'exécution pour en savoir plus sur les variantes d'images de base.

Assembler des images de conteneur pour les exécuter en local

Les images de conteneur d'application utilisées avec les mises à jour automatiques des images de base sont basées sur scratch et ne peuvent pas être exécutées en dehors de Cloud Run lorsque les mises à jour des images de base sont activées. Vous pouvez rendre votre image d'application exécutable en la redéfinissant sur une image de base compatible.

  1. Installez Docker Community Edition (CE) sur votre poste de travail.

  2. Téléchargez l'image de l'application :

    docker pull APP_IMAGE
    

    Remplacez APP_IMAGE par l'URL de votre image de conteneur.

  3. Téléchargez l'image de base :

    docker pull BASE_IMAGE
    

    Remplacez BASE_IMAGE par le chemin d'accès complet à une image de base compatible. Pour obtenir la liste des images de base disponibles, consultez Images de base des buildpacks de Google Cloud.

  4. Assemblez l'image :

    Utilisez un fichier Dockerfile pour copier tous les fichiers de l'image de l'application sur l'image de base :

    ARG APP_IMAGE
    ARG NEW_BASE_IMAGE
    
    # first copy all files from the app image onto the builder image
    FROM ${APP_IMAGE} AS app
    FROM ${NEW_BASE_IMAGE} AS builder
    COPY --from=app / /
    
    # restore the app image config by copying everything from previous step back
    # back onto the app image
    FROM ${APP_IMAGE}
    COPY --from=builder / /
    

    Créez l'image comme suit :

    docker build \
        -t IMAGE \
        --build-arg APP_IMAGE=APP_IMAGE \
        --build-arg NEW_BASE_IMAGE=BASE_IMAGE \
        .
    

    Remplacez IMAGE par le nom de votre image assemblée.

    Si des avertissements indiquent que ARG ${APP_IMAGE} et ARG ${NEW_BASE_IMAGE} ne sont pas des images de base valides, vous pouvez les ignorer et exécuter l'image :

    docker run -p 8080:8080 IMAGE
    

Désactiver les mises à jour automatiques

Déploiement à partir d'une source

Lors du déploiement à partir de la source, vous pouvez désactiver les mises à jour automatiques de l'image de base à l'aide de l'option --no-automatic-updates. L'exemple suivant montre comment désactiver les mises à jour automatiques des images de base pour un service Node.js :

gcloud

gcloud run deploy SERVICE \
    --source . \
    --base-image nodejs22 \
    --no-automatic-updates

Lors du déploiement d'une image de conteneur

Pour désactiver les mises à jour de l'image de base pour un service qui utilise une image de conteneur basée sur scratch, vous devez déployer une nouvelle image de conteneur qui inclut l'image de base et la supprimer :

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Pour désactiver les mises à jour automatiques des images de base, exécutez la commande suivante :

    gcloud run deploy SERVICE \
        --image IMAGE \
        --base-image ""

    Remplacez les éléments suivants :

    • SERVICE : nom du service sur lequel vous souhaitez déployer.
    • IMAGE : URL de votre image de conteneur contenant l'application, l'environnement d'exécution et l'OS.
  3. YAML

    1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

      gcloud run services describe SERVICE --format export > service.yaml
    2. Supprimez l'annotation run.googleapis.com/base-images.

    3. Supprimez l'attribut runtimeClassName.

    4. Dans image, veillez à utiliser une image de conteneur qui inclut l'application, l'environnement d'exécution et l'OS.

    5. Créez ou mettez à jour le service à l'aide de la commande suivante :

      gcloud run services replace service.yaml

Afficher la version de l'image de base

Pour afficher la version de l'image de base utilisée pour diffuser votre application, consultez la ressource LogEntry.labels.run.googleapis.com/base_image_versions dans les journaux de service Cloud Run.

Limitations connues

  • Les mises à jour automatiques des images de base ne sont compatibles qu'avec les images de base des buildpacks de Google Cloud. Il n'est pas possible d'utiliser vos propres images de base.

  • Les applications utilisant des langages compilés ne seront pas recompilées suite à la mise à jour automatique de l'image de base.

  • Les analyses de sécurité sur l'image de votre application peuvent être incomplètes. Étant donné que l'image de votre application est désormais basée sur scratch, les analyseurs de sécurité se concentrent sur la partie application de votre image. Pour obtenir une image plus complète de la sécurité de vos conteneurs, vous devez également exécuter des analyses sur l'image de base correspondante fournie par Google. Vous pouvez télécharger l'image de base et utiliser des outils Open Source pour effectuer une analyse.