Exécuter Rails dans l'environnement Cloud Run

Apprenez à déployer un exemple d'application Rails sur Cloud Run et à intégrer des bases de données gérées, un espace de stockage d'objets, des secrets chiffrés et des pipelines de compilation avec une solution de calcul sans serveur.

Le déploiement d'applications Rails implique l'intégration de plusieurs services pour former un projet cohérent. Dans ce tutoriel, nous partons du principe que vous connaissez bien le développement Web avec Rails.

Ce tutoriel nécessite Ruby 3.0 ou une version ultérieure (Ruby 2.7 est également compatible, consultez la section "Comprendre le code") et Rails 6 ou une version ultérieure.

Schéma illustrant l'architecture du déploiement
Le site Rails est diffusé depuis Cloud Run, qui utilise plusieurs services externes pour stocker différents types de données (informations de base de données relationnelle, ressources multimédias, secrets de configuration et images de conteneurs). Les services de backend sont mis à jour par Cloud Build lors d'une tâche de compilation et de migration.

Objectifs

  • Créer une base de données Cloud SQL et l'associer à Active Record
  • Créer et utiliser Secret Manager pour stocker une clé principale Rails et y accéder en toute sécurité
  • Héberger des fichiers et des fichiers multimédias importés par les utilisateurs sur Cloud Storage à partir d'Active Storage
  • Automatiser les migrations de compilations et de bases de données à l'aide de Cloud Build
  • Déployer une application Rails sur Cloud Run

Coûts

Avant de commencer

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Assurez-vous que le compte utilisé pour ce tutoriel dispose des autorisations suffisantes.

Préparer l'environnement

Définir le projet par défaut

Définissez la configuration de projet par défaut pour la CLI gcloud en exécutant la commande suivante:

gcloud config set project PROJECT_ID

Remplacez PROJECT_ID par votre ID de projet Google Cloud nouvellement créé.

Cloner l'application Rails

Le code de l'exemple d'application Rails se trouve dans le dépôt GoogleCloudPlatform/ruby-docs-samples sur GitHub.

  1. Clonez le dépôt :

    git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
    
  2. Accédez au répertoire qui contient l'exemple de code et exécutez les commandes suivantes pour vous assurer que l'application est correctement configurée avec les gems et dépendances nécessaires :

    Linux/macOS

    cd ruby-docs-samples/run/rails
    bundle install
    

    Windows

    cd ruby-docs-samples\run\rails
    bundle install
    

Préparer les services externes

Ce tutoriel utilise un certain nombre de services Google Cloud pour fournir la base de données, le stockage multimédia et le stockage des secrets compatibles avec le projet Rails déployé. Ces services sont déployés dans une région spécifique. Pour plus d'efficacité entre les services, il est préférable que tous les services soient déployés dans la même région. Pour plus d'informations sur la région la plus proche de vous, consultez la section Produits disponibles par région.

Configurer une instance Cloud SQL pour PostgreSQL

Rails est compatible avec plusieurs bases de données relationnelles, dont plusieurs proposées par Cloud SQL. Ce tutoriel utilise PostgreSQL, une base de données Open Source couramment utilisée par les applications Rails.

Les sections suivantes décrivent la création d'une instance PostgreSQL, d'une base de données et d'un utilisateur de base de données pour votre application Rails.

Créer une instance PostgreSQL

Console

  1. Dans Google Cloud Console, accédez à la page Instances Cloud SQL.

    Accéder à la page Instances Cloud SQL

  2. Cliquez sur Create Instance (Créer une instance).

  3. Cliquez sur Choisir PostgreSQL.

  4. Dans le champ ID d'instance, saisissez un nom pour l'instance (INSTANCE_NAME).

  5. Dans le champ Mot de passe, entrez le mot de passe de l'utilisateur Postgres.

  6. Utilisez les valeurs par défaut dans les autres champs.

  7. Cliquez sur Create Instance (Créer une instance).

gcloud

  • Créez l'instance PostgreSQL :

    gcloud sql instances create INSTANCE_NAME \
        --database-version POSTGRES_12 \
        --tier db-f1-micro \
        --region REGION
    

    Remplacez les éléments suivants :

    La création de l'instance et la préparation à son utilisation prennent quelques minutes.

Créer une base de données

Console

  1. Dans Google Cloud Console, accédez à la page Instances Cloud SQL.

    Accéder à la page Instances Cloud SQL

  2. Sélectionnez l'instance INSTANCE_NAME.

  3. Accédez à l'onglet Bases de données.

  4. Cliquez sur Create database.

  5. Dans la boîte de dialogue Nom de la base de données, saisissez DATABASE_NAME.

  6. Cliquez sur Créer.

gcloud

  • Créez la base de données dans l'instance récemment créée :

    gcloud sql databases create DATABASE_NAME \
        --instance INSTANCE_NAME
    

    Remplacez DATABASE_NAME par le nom de la base de données dans l'instance.

Créer un compte utilisateur

Générez un mot de passe aléatoire pour l'utilisateur de la base de données, puis écrivez-le dans un fichier nommé dbpassword :

cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1 > dbpassword

Console

  1. Dans Google Cloud Console, accédez à la page Instances Cloud SQL.

    Accéder à la page Instances Cloud SQL

  2. Sélectionnez l'instance INSTANCE_NAME.

  3. Accédez à l'onglet Utilisateurs.

  4. Cliquez sur Ajouter un compte utilisateur.

  5. Sous la boîte de dialogue Authentification intégrée :

    1. Saisissez le nom d'utilisateur DATABASE_USERNAME.
    2. Saisissez le contenu du fichier dbpassword en tant que mot de passe PASSWORD.
  6. Cliquez sur Ajouter.

gcloud

  • Créez l'utilisateur dans l'instance récemment créée et définissez son mot de passe sur le contenu de dbpassword :

    gcloud sql users create DATABASE_USERNAME \
       --instance=INSTANCE_NAME --password=$(cat dbpassword)
    

    Remplacez DATABASE_USERNAME par le nom de la base de données dans l'instance.

Configurer un bucket Cloud Storage

Vous pouvez héberger des éléments statiques et des fichiers multimédias Rails importés par les utilisateurs dans un espace de stockage d'objets à disponibilité élevée à l'aide de Cloud Storage.

Console

  1. In the Google Cloud console, go to the Cloud Storage Buckets page.

    Go to Buckets page

  2. Click Create bucket.
  3. On the Create a bucket page, enter your bucket information. To go to the next step, click Continue.
    • For Name your bucket, enter a name that meets the bucket naming requirements.
    • For Location, select the following: us-central1
    • For Choose a default storage class for your data, select the following: Standard.
    • For Choose how to control access to objects, select an Access control option.
    • For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
  4. Click Create.

gcloud

L'outil de ligne de commande gsutil a été installé lors de l'installation de la CLI gcloud.

  • Créer un bucket Cloud Storage Pour créer un nom de bucket Cloud Storage unique, utilisez le PROJECT_ID et le suffixe de votre choix, MEDIA_BUCKET_SUFFIX. Dans Cloud Storage, les noms de buckets doivent être uniques.

    gsutil mb -l REGION gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX
    

Après avoir créé un bucket, modifiez les autorisations des objets d'image pour que tout le monde puisse les lire.

Console

  1. Dans Google Cloud Console, accédez à la page Buckets de Cloud Storage.

    Accéder à la page "Buckets"

  2. Dans la liste des buckets, cliquez sur le nom de celui que vous souhaitez rendre public.

  3. Sélectionnez l'onglet Autorisations en haut de la page.

  4. Cliquez sur le bouton Ajouter des membres.

    La boîte de dialogue Ajouter des membres s'affiche.

  5. Dans le champ Nouveaux membres, saisissez allUsers.

  6. Dans la liste déroulante Sélectionner un rôle, sélectionnez le sous-menu Cloud Storage, puis cliquez sur l'option Lecteur des objets Storage.

  7. Cliquez sur Save (Enregistrer).

Une fois le partage public effectué, un lien s'affiche pour chaque objet dans la colonne Accès public. Vous pouvez cliquer sur cette icône pour obtenir l'URL de l'objet.

Pour savoir comment obtenir des informations détaillées sur les erreurs concernant les opérations Ruby ayant échoué dans la console Google Cloud, consultez la page Dépannage.

gcloud

  • Exécutez la commande gsutil iam ch pour rendre tous les objets publics. Utilisez la valeur MEDIA_BUCKET_SUFFIX que vous avez utilisée lors de la création du bucket.

    gsutil iam ch allUsers:objectViewer gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX
    

Stocker les valeurs du secret dans Secret Manager

Maintenant que les services externes sont configurés, Rails nécessite des informations sécurisées, telles que des mots de passe, pour accéder à ces services. Au lieu de placer ces valeurs directement dans le code source Rails, ce tutoriel utilise les identifiants Rails et Secret Manager pour stocker ces informations en toute sécurité.

Créer un fichier d'identifiants chiffrés et stocker la clé en tant que secret Secret Manager

Rails stocke les secrets dans un fichier chiffré nommé "config/credentials.yml.enc". Le fichier peut être déchiffré à l'aide de la clé config/master.key locale ou de la variable d'environnement ENV[“RAILS_MASTER_KEY”]. Dans le fichier d'identifiants, vous pouvez stocker le mot de passe de la base de données d'instance Cloud SQL ainsi que d'autres clés d'accès pour les API externes.

Vous pouvez stocker cette clé en toute sécurité dans Secret Manager. Ensuite, vous pouvez autoriser Cloud Run et Cloud Build à accéder à la clé en accordant l'accès à leurs comptes de service respectifs. Les comptes de service sont identifiés par une adresse e-mail contenant le numéro de projet.

  1. Générez le fichier config/credentials.yml.enc à l'aide de la commande suivante :

    bin/rails credentials:edit
    

    La commande crée une clé config/master.key si aucune clé principale n'est définie, ainsi qu'un fichier config/credentials.yml.enc si le fichier n'existe pas. Cela ouvre un fichier temporaire dans votre fichier $EDITOR par défaut avec le contenu déchiffré pour les secrets à ajouter.

  2. Copiez et collez le mot de passe de la base de données d'instance PostgreSQL que vous venez de créer depuis le fichier dbpassword vers le fichier d'identifiants :

    secret_key_base: GENERATED_VALUE
    gcp:
      db_password: PASSWORD
    

    Les secrets sont accessibles avec Rails.application.credentials. Par exemple, Rails.application.credentials.secret_key_base doit renvoyer la base de clé secrète de l'application et Rails.application.credentials.gcp[:db_passsword] doit renvoyer le mot de passe de votre base de données.

  3. Le dossier config/credentials/yml.enc est stocké de manière chiffrée, mais config/master.key peut être stocké dans Secret Manager.

    Console

    1. Dans Google Cloud Console, accédez à la page Secret Manager.

      Accéder à la page Secret Manager

    2. Cliquez sur Créer un secret.

    3. Dans le champ Nom, saisissez un nom pour le secret RAILS_SECRET_NAME.

    4. Dans la boîte de dialogue Valeur du secret, collez la valeur "master.key" dans la zone.

    5. Cliquez sur Créer un secret.

    6. Sur la page "Informations détaillées sur le secret" de votre secret, notez le numéro du projet :

      projects/PROJECTNUM/secrets/RAILS_SECRET_NAME

    7. Dans l'onglet Autorisations, cliquez sur Ajouter un membre.

    8. Dans le champ Nouveaux membres, saisissez PROJECTNUM-compute@developer.gserviceaccount.com, puis appuyez sur Enter.

    9. Dans le champ Nouveaux membres, saisissez PROJECTNUM@cloudbuild.gserviceaccount.com, puis appuyez sur Enter.

    10. Dans le menu déroulant Rôle, sélectionnez Accesseur de secrets de Secret Manager.

    11. Cliquez sur Save (Enregistrer).

    gcloud

    1. Créez un secret avec la valeur de config/master.key :

      gcloud secrets create RAILS_SECRET_NAME --data-file config/master.key
      

      Remplacez RAILS_SECRET_NAME par le nom du nouveau secret.

    2. Pour confirmer la création du secret, vérifiez-le :

      gcloud secrets describe RAILS_SECRET_NAME
      
      gcloud secrets versions access latest --secret RAILS_SECRET_NAME
      
    3. Obtenez la valeur du numéro de projet :

      gcloud projects describe PROJECT_ID --format='value(projectNumber)'
      
    4. Accordez l'accès au secret au compte de service Cloud Run :

      gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \
          --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
      

      Remplacez PROJECTNUM par la valeur du numéro de projet ci-dessus.

    5. Accordez l'accès au secret au compte de service Cloud Build :

      gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \
          --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
      

      Dans le résultat, confirmez que bindings identifie les deux comptes de service en tant que membres.

Connecter l'application Rails à la base de données et à l'espace de stockage de production

Dans ce tutoriel, nous utilisons une instance PostgreSQL comme base de données de production et Cloud Storage comme backend de stockage. Pour que Rails puisse se connecter à la base de données et au bucket de stockage nouvellement créés, vous devez spécifier toutes les informations nécessaires pour y accéder dans le fichier .env. Le fichier .env contient la configuration des variables d'environnement d'application. L'application lit ce fichier à l'aide du gem dotenv. Comme les secrets sont stockés dans credentials.yml.enc et Secret Manager, le fichier .env n'a pas besoin d'être chiffré, car il ne contient aucun identifiant sensible.

  1. Pour configurer l'application Rails afin qu'elle se connecte à la base de données et au bucket de stockage, ouvrez le fichier .env.
  2. Modifiez la configuration du fichier .env comme suit. Utilisez la valeur MEDIA_BUCKET_SUFFIX que vous avez utilisée lors de la création du bucket.

    PRODUCTION_DB_NAME: DATABASE_NAME
    PRODUCTION_DB_USERNAME: DATABASE_USERNAME
    CLOUD_SQL_CONNECTION_NAME: PROJECT_ID:REGION:INSTANCE_NAME
    GOOGLE_PROJECT_ID: PROJECT_ID
    STORAGE_BUCKET_NAME: PROJECT_ID-MEDIA_BUCKET_SUFFIX
    

    L'application Rails est désormais configurée de manière à utiliser Cloud SQL et Cloud Storage lors du déploiement sur Cloud Run.

Autoriser Cloud Build à accéder à Cloud SQL

Pour que Cloud Build puisse appliquer les migrations de base de données, vous devez autoriser Cloud Build à accéder à Cloud SQL.

Console

  1. Dans Google Cloud Console, accédez à la page Identity and Access Management.

    Accéder à la page "Identity and Access Management"

  2. Pour modifier l'entrée du membre PROJECTNUM@cloudbuild.gserviceaccount.com, cliquez sur  Modifier le membre.

  3. Cliquez sur Ajouter un autre rôle.

  4. Dans la boîte de dialogue Sélectionner un rôle, sélectionnez Client Cloud SQL.

  5. Cliquez sur Enregistrer.

gcloud

  • Autorisez Cloud Build à accéder à Cloud SQL :

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \
        --role roles/cloudsql.client
    

Déployer l'application sur Cloud Run

Une fois les services externes configurés, vous pouvez déployer l'application en tant que service Cloud Run.

  1. À l'aide du fichier cloudbuild.yaml fourni, utilisez Cloud Build pour créer l'image, exécuter les migrations de la base de données et renseigner les éléments statiques :

    gcloud builds submit --config cloudbuild.yaml \
        --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
    

    Remplacez SERVICE_NAME par le nom de votre service. Cette première compilation prend quelques minutes. Si le délai de compilation est dépassé, augmentez-le en insérant "--timeout=2000s" dans la commande de compilation ci-dessus.

  2. Une fois la compilation réussie, déployez le service Cloud Run pour la première fois en définissant la région du service, l'image de base et l'instance Cloud SQL connectée :

    gcloud run deploy SERVICE_NAME \
         --platform managed \
         --region REGION \
         --image gcr.io/PROJECT_ID/SERVICE_NAME \
         --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \
         --allow-unauthenticated
    

    Vous devriez obtenir un résultat indiquant que le déploiement a réussi, avec une URL de service :

    Service [SERVICE_NAME] revision [SERVICE_NAME-00001-tug] has been deployed
     and is serving 100 percent of traffic at https://SERVICE_NAME-HASH-uc.a.run.app

  3. Pour afficher le service déployé, accédez à l'URL du service.

    Capture d'écran de la page de destination d'une application d'album photo de chats.
    Si l'URL du service affiche Cat Photo Album (Album photo de chats), vous êtes sur la page d'accueil de l'application.

  4. Essayez d'importer une nouvelle photo. Si la photo a bien été importée, l'application Rails a bien été déployée.

    Capture d'écran de la page de destination d'une application d'album photo de chats avec une photo.

Mettre à jour de l'application

Alors que la procédure initiale de création et de déploiement était complexe, la mise à jour est un processus plus simple :

  1. Exécutez le script de compilation et de migration Cloud Build :

    gcloud builds submit --config cloudbuild.yaml \
         --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
    
  2. Déployez le service en spécifiant uniquement la région et l'image :

    gcloud run deploy SERVICE_NAME \
         --platform managed \
         --region REGION \
         --image gcr.io/PROJECT_ID/SERVICE_NAME
    

Comprendre le code

L'exemple d'application Rails a été créé à l'aide des commandes Rails standards. Les commandes suivantes créent l'application "cat_album" et utilisent la commande scaffold pour générer un modèle, un contrôleur et des vues pour la ressource Photo :

rails new cat_album
rails generate scaffold Photo caption:text

Connexion à une base de données

Le fichier config/database.yml contient la configuration nécessaire pour accéder à vos bases de données dans différents environnements (développement, test, production). Par exemple, la base de données de production est configurée de manière à s'exécuter dans Cloud SQL pour PostgreSQL. Le nom de la base de données et le nom de l'utilisateur sont définis via des variables d'environnement dans le fichier .env, tandis que le mot de passe de la base de données est stocké dans le fichier config/credentials.yml.enc, ce qui nécessite l'élément RAILS_MASTER_KEY pour le déchiffrement.

Lorsque l'application s'exécute sur Cloud Run (entièrement géré), elle se connecte à l'instance PostgreSQL à l'aide d'un socket fourni par l'environnement Cloud Run. Lorsque l'application s'exécute sur votre ordinateur local, elle se connecte à l'instance PostgreSQL à l'aide du proxy Cloud SQL Auth.

production:
  <<: *default
  database: <%= ENV["PRODUCTION_DB_NAME"] %>
  username: <%= ENV["PRODUCTION_DB_USERNAME"] %>
  password: <%= Rails.application.credentials.gcp[:db_password] %>
  host: "<%= ENV.fetch("DB_SOCKET_DIR") { '/cloudsql' } %>/<%= ENV["CLOUD_SQL_CONNECTION_NAME"] %>"

Fichiers multimédias importés par les utilisateurs dans le cloud

Rails vous permet d'importer des fichiers dans Cloud Storage à l'aide d'Active Storage. Les fichiers config/storage.yml et config/environments/production.rb spécifient Cloud Storage en tant que fournisseur de services dans l'environnement de production.

google:
  service: GCS
  project: <%= ENV["GOOGLE_PROJECT_ID"] %>
  bucket: <%= ENV["STORAGE_BUCKET_NAME"] %>
# Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :google

Automatisation avec Cloud Build

Le fichier cloudbuild.yaml exécute non seulement les étapes de compilation d'images classiques (création d'une image de conteneur et transfert de celle-ci vers Container Registry), mais aussi les migrations de bases de données Rails. Celles-ci nécessitent un accès à la base de données, rendu possible par app-engine-exec-wrapper, un outil d'aide pour le proxy d'authentification Cloud SQL :

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    entrypoint: 'bash'
    args: ["-c", "docker build --build-arg MASTER_KEY=$$RAILS_KEY -t gcr.io/${PROJECT_ID}/${_SERVICE_NAME} . "]
    secretEnv: ["RAILS_KEY"]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}"]

  - id: "apply migrations"
    name: "gcr.io/google-appengine/exec-wrapper"
    entrypoint: "bash"
    args:
      [
        "-c",
        "/buildstep/execute.sh -i gcr.io/${PROJECT_ID}/${_SERVICE_NAME} -s ${PROJECT_ID}:${_REGION}:${_INSTANCE_NAME} -e RAILS_MASTER_KEY=$$RAILS_KEY -- bundle exec rails db:migrate"
      ]
    secretEnv: ["RAILS_KEY"]

substitutions:
  _REGION: us-central1
  _SERVICE_NAME: rails-cat-album
  _INSTANCE_NAME: cat-album
  _SECRET_NAME: rails-master-key

availableSecrets:
  secretManager:
  - versionName: projects/${PROJECT_ID}/secrets/${_SECRET_NAME}/versions/latest
    env: RAILS_KEY

images:
  - "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}"

Des variables de substitution sont utilisées dans cette configuration. Modifier les valeurs directement dans le fichier signifie que l'option --substitutions peut être supprimée au moment de la migration.

Dans cette configuration, seules les migrations existantes dans le répertoire db/migrate sont appliquées. Pour créer des fichiers de migration, consultez la page Migrations Active Record.

Pour créer l'image et appliquer des migrations, la configuration Cloud Build doit disposer d'un accès au secret RAILS_MASTER_KEY à partir de Secret Manager. Le champ availableSecrets définit la version du secret et les variables d'environnement à utiliser pour ce secret. Le secret de la clé principale est transmis en tant qu'argument à l'étape de compilation de l'image, puis est défini comme étant RAILS_MASTER_KEY dans le fichier Dockerfile lors de la compilation de l'image.

ARG MASTER_KEY
ENV RAILS_MASTER_KEY=${MASTER_KEY}

Pour étendre la configuration Cloud Build afin d'inclure le déploiement dans une seule configuration sans avoir à exécuter deux commandes, consultez la page Déploiement continu à partir de Git à l'aide de Cloud Build. Cela nécessite des modifications IAM, comme décrit dans cette page.

Compatibilité avec Ruby 2.7

Bien que ce tutoriel utilise Ruby 3.0, Ruby 2.7 est également compatible. Pour utiliser Ruby 2.7, définissez l'image de base Ruby dans le fichier Dockerfile sur 2.7.

# Pinning the OS to buster because the nodejs install script is buster-specific.
# Be sure to update the nodejs install command if the base image OS is updated.
FROM ruby:3.0-buster

Nettoyage

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.