Configurare gli aggiornamenti automatici delle immagini di base

La configurazione degli aggiornamenti automatici delle immagini di base per Cloud Run consente a Google di applicare automaticamente patch di sicurezza ai componenti di runtime del sistema operativo e del linguaggio dell'immagine di base. Non devi ricompilare o ridistribuire il tuo servizio per aggiornare l'immagine di base. Non viene creata una nuova revisione quando l'immagine di base viene aggiornata.

Per informazioni sull'impostazione dei criteri di aggiornamento della sicurezza per le funzioni create utilizzando i comandi gcloud functions 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 disposti a strati sopra il runtime del linguaggio, i pacchetti del sistema operativo e il 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 dell'ambiente di runtime vengono pubblicati nelle nuove versioni dell'immagine del runtime. Dopo un periodo di test per stabilità e affidabilità, il runtime aggiornato viene implementato in tutti i servizi con conseguente aggiornamento senza tempi di inattività. Per applicare le correzioni di sicurezza a livello di linguaggio, potresti dover ricompilare le funzioni o i servizi che utilizzano linguaggi compilati come Go o Java.

  • Sugli aggiornamenti del deployment: gli aggiornamenti e le patch di sicurezza vengono applicati ai runtime solo quando i servizi vengono sottoposti a deployment o redeployment, se non diversamente indicato. Gli aggiornamenti al deployment sono disponibili sia per Cloud Run Functions 1ª generazionen.) 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:

Configurare gli aggiornamenti automatici dell'immagine di base

Per configurare gli aggiornamenti automatici dell'immagine 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 modo sicuro 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 aggiungono in un livello superiore le librerie, i file binari e i file di configurazione necessari per eseguire l'applicazione.

I buildpack di Google Cloud pubblicano e gestiscono immagini di base per la creazione di applicazioni serverless. Queste immagini di base sono create 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 buildpack, devi considerare 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.

Creazione dell'immagine dell'applicazione

I servizi con 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 di Cloud Run dall'origine (consigliato)
  • Utilizzando un sistema di compilazione, copia l'applicazione in un'immagine scratch.

Esegui il deployment dall'origine

Puoi utilizzare l'opzione di deployment dell'origine di Cloud Run per creare ed eseguire il deployment del codice in modo che il servizio sia compatibile con la ricezione di 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 dell'immagine di base abilitati, utilizzeresti il seguente comando:

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

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

Costruisci su scratch

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

Quando esegui il deployment di un servizio Cloud Run con aggiornamenti automatici dell'immagine di base, l'immagine container dell'applicazione viene stratificata sopra 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 in più fasi che:
    1. Crea l'applicazione utilizzando un'immagine di base appropriata con le dipendenze richieste.
    2. Copia i componenti integrati in un'immagine scratch.
  2. Crea l'immagine container dell'applicazione ed eseguine 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 in più fasi

Per questa guida utilizzeremo un'applicazione Node.js. Questa guida non è specifica per una lingua e può essere personalizzata per la tua applicazione e la tua lingua.

  • Crea un file Dockerfile nella directory principale del progetto con il seguente contenuto:

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

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

Creazione dell'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 nodejs22 e la regione europe-west1. Per scoprire di più sulle varianti dell'immagine di base, consulta le immagini di base di runtime.

Per ulteriori dettagli sui ruoli e sulle autorizzazioni richiesti, consulta la sezione Eseguire il deployment dal codice sorgente.

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. Per abilitare gli aggiornamenti automatici per il runtime nodejs22 durante il deployment dell'immagine dell'applicazione, esegui questo comando:

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

    Sostituisci:

    • SERVICE con il nome del servizio di cui vuoi eseguire il deployment.
    • APP_IMAGE con l'URL dell'immagine container dell'applicazione.
    • BASE_IMAGE con l'URL dell'immagine di base, ad esempio nodejs22 o europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22 Consulta la sezione Immagini di base di 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:

    • SERVICE con il nome del servizio di cui vuoi eseguire il deployment.
    • APP_IMAGE con l'URL dell'immagine container dell'applicazione.
    • BASE_IMAGE con l'URL dell'immagine di base, ad esempio europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Consulta le immagini di base di 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 risorsa google_cloud_run_v2_service nella configurazione 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"
    }
  }
}

Sostituisci:

  • SERVICE con il nome del servizio di cui vuoi eseguire il deployment.
  • REGION con la regione Google Cloud .
  • IMAGE_URL con 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 ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • BASE_IMAGE con l'URL dell'immagine di base, ad esempio us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Consulta le immagini di base di runtime per scoprire di più sulle varianti delle immagini di base.

Ricompila le immagini container per eseguirle localmente

Le immagini container dell'applicazione utilizzate con gli aggiornamenti automatici delle immagini di base sono 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 sopra un'immagine di base compatibile.

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

  2. Scarica l'immagine dell'applicazione:

    docker pull APP_IMAGE
    

    Sostituisci APP_IMAGE con l'URL dell'immagine del container.

  3. Scarica l'immagine di base:

    docker pull BASE_IMAGE
    

    Sostituisci BASE_IMAGE con il percorso completo dell'immagine di una base compatibile. Consulta Immagini di base dei buildpack di Google Cloud per un elenco delle immagini di base disponibili.

  4. Ricompone 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 ricomposta.

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

    docker run -p 8080:8080 IMAGE
    

Disattivare gli aggiornamenti automatici

Quando esegui il deployment dall'origine

Quando esegui il deployment dall'origine, puoi disattivare gli aggiornamenti automatici dell'immagine di base utilizzando il flag --no-automatic-updates. Il seguente esempio mostra come disattivare gli aggiornamenti automatici dell'immagine di base per un servizio Node.js:

gcloud

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

Quando esegui il deployment di un'immagine container

Per disattivare gli aggiornamenti dell'immagine 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. 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. Per disattivare gli aggiornamenti automatici dell'immagine di base, esegui questo comando:

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

    Sostituisci:

    • SERVICE con il nome del servizio di cui vuoi eseguire il deployment.
    • IMAGE con 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 seguente comando:

    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 risorsa LogEntry.labels.run.googleapis.com/base_image_versions nei log del servizio 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 a seguito di un aggiornamento automatico dell'immagine di base.

  • Le scansioni di sicurezza sull'immagine dell'applicazione potrebbero essere incomplete. Poiché l'immagine dell'applicazione ora è basata su scratch, gli scanner di sicurezza eseguiranno la scansione solo della parte dell'immagine relativa all'applicazione. Per ottenere un'immagine più completa della sicurezza dei container, devi eseguire 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.