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 nouvelle révision n'est créée lorsque l'image de base est mise à jour.

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.

Schéma de l'image de base Cloud Run

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 redéfinir en toute sécurité votre service en cours d'exécution.

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 Linux Ubuntu.

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

Lorsque vous choisissez un buildpack Google Cloud, vous devez tenir compte des points suivants :

  • 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 doivent fournir une image d'application qui omet les couches de base du système d'exploitation. Pour ce faire, deux moyens s'offrent à vous :

Déployer une fonction à partir d'une source

Vous pouvez utiliser la fonctionnalité de déploiement à partir de la source de Cloud Run pour compiler et déployer votre code afin que votre service soit compatible avec les 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 ou une fonction Node.js avec les mises à jour automatiques des images de base activées, utilisez la commande suivante :

gcloud beta run deploy \
  --source . \
  --base-image nodejs20

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 de l'image de base.

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

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

  1. Créez un 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 intented at being layered on top of a Node.js base image.
    
    FROM node:20-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 depenencies onto a scratch image.
    FROM scratch
    WORKDIR /workspace
    COPY --from=builder --chown=33:33 /usr/src/app/ ./
    
    # 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. Pour cet exemple, nous utiliserons l'environnement d'exécution Node.js 20 de us-central1. Consultez la section Images de base de l'environnement d'exécution pour en savoir plus sur les variantes d'images de base.

Pour en savoir plus sur les rôles et les autorisations requis, consultez la page Déployer des images de conteneurs sur Cloud Run.

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 de l'environnement d'exécution Node.js 20 lors du déploiement de l'image de votre application, exécutez la commande suivante :

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

    Remplacez :

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

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
    annotations:
      ...
      run.googleapis.com/launch-stage: BETA
      ...
    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 :

    • SERVICE par le nom du service sur lequel vous souhaitez déployer l'image.
    • APP_IMAGE par l'URL de l'image de conteneur de votre application.
    • BASE_IMAGE par l'URL de votre image de base, par exemple us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20. 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 l'URL d'une image de base compatible. La liste des images de base disponibles est disponible dans la section Images de base des buildpacks de Google Cloud. Par exemple, si vous avez créé une application Node.JS 20 à l'aide de la pile google-22, sélectionnez us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest.
  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

Lors d'un déploiement à partir de la 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 de l'image de base pour un service Node.js :

gcloud

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

Lors du déploiement d'une image de conteneur

Pour désactiver les mises à jour de l'image de base d'un service qui utilise une image de conteneur créée à partir de zéro, vous devez déployer une nouvelle image de conteneur qui inclut l'image de base et supprimer l'image de base :

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 beta run deploy SERVICE \
        --image IMAGE \
        --base-image ""

    Remplacez :

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

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

Limites connues

  • Les mises à jour automatiques d'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é de 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.