Configurare gli aggiornamenti automatici dell'immagine di base

La configurazione degli aggiornamenti automatici delle immagini di base per Cloud Run consente a Google di applicare automaticamente le patch di sicurezza ai componenti del sistema operativo e del runtime del linguaggio dell'immagine di base. Non è necessario ricompilare o rieseguire il deployment del servizio per aggiornare l'immagine di base. Quando l'immagine di base viene aggiornata, non viene creata una nuova revisione.

Per scoprire come impostare le policy di aggiornamento della sicurezza per le funzioni create utilizzando gcloud functions comandi o l'API Cloud Functions v2, consulta Sicurezza dell'ambiente di esecuzione.

Il seguente diagramma mostra come il codice e le dipendenze dell'applicazione ("immagine dell'app") sono sovrapposti al runtime del linguaggio, ai pacchetti del sistema operativo e al sistema operativo ("immagine di base"). I componenti dell'immagine di base vengono aggiornati automaticamente da Google.

Diagramma dell'immagine di base di Cloud Run

Policy di aggiornamento della sicurezza

  • Aggiornamenti automatici: gli aggiornamenti e le patch di sicurezza per l'ambiente di runtime vengono pubblicati in nuove versioni dell'immagine di runtime. Dopo un periodo di test dei livelli di stabilità e affidabilità, il runtime aggiornato viene implementato in tutti i servizi, garantendo un aggiornamento senza tempi di inattività. Per applicare le correzioni di sicurezza a livello di linguaggio, potrebbe essere necessario ricompilare le funzioni o i servizi che utilizzano linguaggi compilati come Go o Java.

  • Aggiornamenti in fase di deployment: gli aggiornamenti e le patch di sicurezza vengono applicati ai runtime solo quando viene eseguito o rieseguito il deployment dei servizi, se non diversamente indicato. Gli aggiornamenti in fase di deployment sono disponibili sia per Cloud Run Functions (1ª generazione.) sia per Cloud Run Functions.

Per impostazione predefinita, gli aggiornamenti automatici della sicurezza sono abilitati per le funzioni di cui è stato eseguito il deployment utilizzando:

Panoramica configurazione

Per configurare gli aggiornamenti automatici delle immagini di base:

  • **Seleziona** un'immagine di base Cloud Run compatibile.
  • Crea ed esegui il deployment dell'immagine dell'applicazione in modo da preservare la possibilità di eseguire il rebase in sicurezza del servizio in esecuzione.

Seleziona un'immagine di base

Un'immagine di base è il punto di partenza per la maggior parte dei flussi di lavoro di sviluppo basati su container. Gli sviluppatori iniziano con un'immagine di base e vi aggiungono le librerie, i file binari e i file di configurazione necessari per eseguire l'applicazione.

I buildpack di Google Cloud pubblicano e gestiscono le immagini di base per la creazione di applicazioni serverless. Queste immagini di base sono basate sulla distribuzione Ubuntu Linux.

Cloud Run supporta solo le immagini di base automatiche che utilizzano le immagini di base dei buildpack di Google Cloud.

Quando scegli un'immagine di base dei buildpack, devi tenere conto di quanto segue:

  • Stack: uno stack è costituito da una versione della distribuzione Linux e da pacchetti di sistema, come OpenSSL e curl.
  • Linguaggio: la versione specifica del linguaggio di programmazione utilizzata dalla tua applicazione.

Consulta le immagini di base del runtime per scoprire di più sulle varianti delle immagini di base.

Crea l'immagine dell'applicazione

I servizi con gli aggiornamenti automatici abilitati dovranno fornire un'immagine dell'applicazione che omette i livelli del sistema operativo di base. Esistono due modi per farlo:

  • Utilizza il deployment dall'origine di Cloud Run (consigliato)
  • Utilizza un sistema di compilazione per copiare l'applicazione in un'immagine scratch

Esegui il deployment dall'origine

Puoi utilizzare l'opzione di deployment dall'origine di Cloud Run per creare ed eseguire il deployment del codice in modo che il servizio sia compatibile con la ricezione degli aggiornamenti automatici. Per farlo, devi fornire il flag --base-image quando crei l'applicazione.

Ad esempio, per eseguire il deployment di un servizio Node.js con gli aggiornamenti automatici delle immagini di base abilitati, utilizzeresti il seguente comando:

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

Per eseguire il deployment di una funzione, devi specificare il --function flag con l'entry point della funzione dal codice sorgente.

Crea su scratch

Puoi anche utilizzare la toolchain di build per creare un'immagine container dell'applicazione compatibile con gli aggiornamenti automatici delle immagini di base.

Quando esegui il deployment di un servizio Cloud Run con gli aggiornamenti automatici delle immagini di base, l'immagine container dell'applicazione viene sovrapposta a un'immagine container di base. L'immagine container dell'applicazione deve includere solo l'applicazione, non il sistema operativo o il runtime, che vengono forniti nell'immagine container di base.

Per creare l'immagine container dell'applicazione:

  1. Crea un Dockerfile a più fasi che:
    1. Crea l'applicazione utilizzando un'immagine di base appropriata con le dipendenze richieste.
    2. Copia i componenti creati in un'immagine scratch.
  2. Crea l'immagine container dell'applicazione ed esegui il push su Artifact Registry.
  3. Esegui il deployment dell'immagine container dell'applicazione in Cloud Run e specifica un'immagine di base.

Crea un Dockerfile multifase

In questa guida utilizzeremo un'applicazione Node.js. Questa guida non è specifica per il linguaggio e può essere personalizzata per l'applicazione e il linguaggio.

  • Crea un file Dockerfile nella directory principale del progetto con i seguenti contenuti:

    # 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:24-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" ]
    

Questo Dockerfile utilizza una build multifase per copiare il codice sorgente e le dipendenze dell'applicazione in un'immagine scratch che omette i componenti del sistema operativo, dei pacchetti e del runtime che verranno forniti in fase di runtime dall'immagine di base gestita di Cloud Run.

Crea l'immagine dell'applicazione

Crea l'immagine dell'applicazione e caricala in Artifact Registry. Per informazioni dettagliate su come creare un Dockerfile con Cloud Build e caricarlo in Artifact Registry, consulta Creazione di container.

Esegui il deployment dell'immagine dell'applicazione

Ora puoi eseguire il deployment dell'immagine dell'applicazione con gli aggiornamenti automatici abilitati utilizzando l'immagine di base più compatibile per la tua applicazione. L'esempio seguente utilizza il runtime nodejs24 e la regione europe-west1. Per scoprire di più sulle varianti delle immagini di base, consulta Immagini di base del runtime.

Per ulteriori dettagli sui ruoli e sulle autorizzazioni richiesti, consulta Deployment dal codice sorgente.

gcloud

  1. Nella Google Cloud console, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della Google Cloud console viene avviata una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già inclusa e installata e con valori già impostati per il progetto corrente. L'inizializzazione della sessione può richiedere alcuni secondi.

  2. Per abilitare gli aggiornamenti automatici per il runtime nodejs24 durante il deployment dell'immagine dell'applicazione, esegui il comando seguente:

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

    Sostituisci quanto segue:

    • SERVICE: il nome del servizio di cui vuoi eseguire il deployment.
    • APP_IMAGE: l'URL dell'immagine container dell'applicazione.
    • BASE_IMAGE: l'URL dell'immagine di base, ad esempio nodejs24 o europe-west1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/nodejs24 Consulta Immagini di base del runtime per scoprire di più sulle varianti delle immagini di base.

YAML

  1. Se stai creando un nuovo servizio, salta questo passaggio. Se stai aggiornando un servizio esistente, scarica la relativa configurazione YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Aggiorna runtimeClassName e le annotazioni 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

    Sostituisci quanto segue:

    • SERVICE: il nome del servizio di cui vuoi eseguire il deployment.
    • APP_IMAGE: l'URL dell'immagine container dell'applicazione.
    • BASE_IMAGE: l'URL dell'immagine di base, ad esempio europe-west1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/nodejs24. Consulta Immagini di base del runtime per scoprire di più sulle varianti delle immagini di base.

Terraform

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

Aggiungi quanto segue a una google_cloud_run_v2_service risorsa nella configurazione Terraform:
resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"
      base_image_uri = "BASE_IMAGE"
    }
  }
}

Sostituisci quanto segue:

  • SERVICE: il nome del servizio di cui vuoi eseguire il deployment.
  • REGION: la Google Cloud regione.
  • IMAGE_URL: un riferimento all'immagine container, ad esempio, us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL segue il formato di LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
  • BASE_IMAGE: l'URL dell'immagine di base, ad esempio us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/nodejs24. Consulta Immagini di base del runtime per scoprire di più sulle varianti delle immagini di base.

Riassembla le immagini container per eseguirle in locale

Le immagini container dell'applicazione utilizzate con gli aggiornamenti automatici delle immagini di base vengono create su scratch e non possono essere eseguite al di fuori di Cloud Run con gli aggiornamenti delle immagini di base abilitati. Puoi rendere eseguibile l'immagine dell'applicazione eseguendo il rebase dell'immagine dell'applicazione su un'immagine di base compatibile.

  1. Installa Docker Community Edition (CE) sulla workstation.

  2. Scarica l'immagine dell'applicazione:

    docker pull APP_IMAGE
    

    Sostituisci APP_IMAGE con l'URL dell'immagine container.

  3. Scarica l'immagine di base:

    docker pull BASE_IMAGE
    

    Sostituisci BASE_IMAGE con il percorso completo dell'immagine di un' immagine di base compatibile. Per un elenco delle immagini di base disponibili, consulta Immagini di base dei buildpack di Google Cloud.

  4. Riassembla l'immagine:

    Utilizza un Dockerfile per copiare tutti i file dall'immagine dell'app all'immagine di 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 / /
    

    Crea l'immagine:

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

    Sostituisci IMAGE con il nome dell'immagine riassemblata.

    Se visualizzi avvisi che indicano che ARG ${APP_IMAGE} e ARG ${NEW_BASE_IMAGE} non sono immagini di base valide, puoi ignorarli in sicurezza ed eseguire l'immagine:

    docker run -p 8080:8080 IMAGE
    

Disabilita gli aggiornamenti automatici

Quando esegui il deployment dall'origine

Quando esegui il deployment dall'origine, puoi disabilitare gli aggiornamenti automatici delle immagini di base utilizzando il flag --no-automatic-updates. L'esempio seguente mostra come disabilitare gli aggiornamenti automatici delle immagini di base per un servizio Node.js:

gcloud

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

Quando esegui il deployment di un'immagine container

Per disabilitare gli aggiornamenti delle immagini di base per un servizio che utilizza un'immagine container creata su scratch, devi eseguire il deployment di una nuova immagine container che includa l'immagine di base e rimuovere l'immagine di base:

gcloud

  1. Nella Google Cloud console, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della Google Cloud console viene avviata una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già inclusa e installata e con valori già impostati per il progetto corrente. L'inizializzazione della sessione può richiedere alcuni secondi.

  2. Per disabilitare gli aggiornamenti automatici delle immagini di base, esegui il comando seguente:

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

    Sostituisci quanto segue:

    • SERVICE: il nome del servizio di cui vuoi eseguire il deployment.
    • IMAGE: l'URL dell'immagine container contenente l' app, il runtime e il sistema operativo.

YAML

  1. Se stai creando un nuovo servizio, salta questo passaggio. Se stai aggiornando un servizio esistente, scarica la relativa configurazione YAML:

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

  3. Elimina l'attributo runtimeClassName.

  4. In image, assicurati di utilizzare un'immagine container che includa l'app, il runtime e il sistema operativo.

  5. Crea o aggiorna il servizio utilizzando il comando seguente:

    gcloud run services replace service.yaml

Visualizza la versione dell'immagine di base

Per visualizzare la versione dell'immagine di base utilizzata per pubblicare l'applicazione, visualizza la LogEntry.labels.run.googleapis.com/base_image_versions risorsa nei log dei servizi Cloud Run.

Limitazioni note

  • Gli aggiornamenti automatici delle immagini di base supportano solo le immagini di base dei buildpack di Google Cloud. Non è possibile utilizzare le proprie immagini di base.

  • Le applicazioni che utilizzano linguaggi compilati non verranno ricompilate in seguito a un aggiornamento automatico dell'immagine di base.

  • Le scansioni di sicurezza sull'immagine dell'applicazione potrebbero essere incomplete. Poiché l'immagine dell'applicazione ora è creata su scratch, gli scanner di sicurezza eseguiranno la scansione solo della parte dell'applicazione dell'immagine. Per ottenere un'immagine più completa della sicurezza dei container, devi eseguire le scansioni anche sull'immagine di base fornita da Google corrispondente. Puoi scaricare l'immagine di base e utilizzare strumenti open source per eseguire una scansione.