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.
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 :
- 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 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 :
- Créez un Dockerfile en plusieurs étapes qui :
- Crée l'application en utilisant une image de base appropriée avec les dépendances requises
- Copie les composants compilés sur une image scratch.
- Crée l'image du conteneur d'application et la transfère vers Artifact Registry.
- 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
-
In the Google Cloud console, 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.
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
ouus-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
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
Mettez à jour
runtimeClassName
et les annotationsrun.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.
Installez Docker Community Edition (CE) sur votre poste de travail.
Téléchargez l'image de l'application :
docker pull APP_IMAGE
Remplacez :
- APP_IMAGE par l'URL de votre image de conteneur ;
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électionnezus-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest
.
- 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
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}
etARG ${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
-
In the Google Cloud console, 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.
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
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
Supprimez l'annotation
run.googleapis.com/base-images
.Supprimez l'attribut
runtimeClassName
.Dans
image
, veillez à utiliser une image de conteneur qui inclut l'application, l'environnement d'exécution et l'OS.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.