Configurare gli aggiornamenti automatici delle immagini di base

La configurazione degli aggiornamenti automatici dell'immagine 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 è necessario ricostruire o eseguire nuovamente il deployment del servizio per aggiornare l'immagine di base. Non viene creata alcuna nuova revisione quando l'immagine di base viene aggiornata.

Il seguente diagramma mostra come il codice e le dipendenze dell'applicazione ("immagine dell'app") vengono 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 Cloud Run

Per configurare gli aggiornamenti automatici delle immagini di base:

  • Seleziona un'immagine di base Cloud Run compatibile.
  • Crea e esegui il deployment dell'immagine dell'applicazione in modo da mantenere 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 sovrappongono le librerie, i file di configurazione e i file binari necessari per eseguire la loro applicazione.

I buildpack di Google Cloud pubblicano e gestiscono le 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 buildpack di Google Cloud, devi considerare quanto segue:

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

Consulta le immagini di base di 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 ometta i livelli di sistema operativo di base. Puoi farlo in due modi:

Esegui il deployment dall'origine

Puoi utilizzare la funzionalità di deployment dall'origine di Cloud Run per compilare 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 durante la creazione dell'applicazione.

Ad esempio, per eseguire il deployment di un servizio o di una funzione Node.js con gli aggiornamenti automatici dell'immagine di base abilitati, utilizza il seguente comando:

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

Creata il giorno scratch

Puoi anche utilizzare la tua toolchain di compilazione 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 aggiornamenti automatici dell'immagine di base, l'immagine container dell'applicazione viene sovrapposta a un'immagine container di base. L'immagine del contenitore dell'applicazione deve includere solo l'applicazione, non il sistema operativo o il runtime, che sono forniti nell'immagine del contenitore di base.

Per creare l'immagine del contenitore dell'applicazione, svolgi i seguenti passaggi:

  1. Crea un Dockerfile multi-fase che:
    1. Compila l'applicazione utilizzando un'immagine di base appropriata con le dipendenze richieste.
    2. Copia i componenti compilati in un'immagine di scratch.
  2. Crea l'immagine del contenitore dell'applicazione ed eseguine il push in Artifact Registry.
  3. Esegui il deployment dell'immagine del container dell'applicazione in Cloud Run e specifica un'immagine di base.

Creare un Dockerfile multi-fase

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

  • Crea un file Dockerfile nella directory principale del progetto con quanto segue:

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

Questo Dockerfile utilizza una compilazione a più fasi per copiare il codice sorgente e le dipendenze dell'applicazione 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 di 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 la sezione Creazione di contenitori.

Esegui il deployment dell'immagine dell'applicazione

Ora puoi eseguire il deployment dell'immagine dell'applicazione con gli aggiornamenti automatici attivati utilizzando l'immagine di base più compatibile per la tua applicazione. Per questo esempio utilizzeremo il runtime Node.js 20 di us-central1. Consulta le immagini di base di runtime per scoprire di più sulle varianti delle immagini di base.

Per ulteriori dettagli sui ruoli e sulle autorizzazioni richiesti, consulta la sezione relativa al deployment delle immagini contenitore in 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. Per abilitare gli aggiornamenti automatici per il runtime Node.js 20 durante il deployment dell'immagine dell'applicazione, esegui il seguente comando:

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

    Sostituisci:

    • SERVICE con il nome del servizio in cui vuoi eseguire il deployment.
    • APP_IMAGE con l'URL dell'immagine del container dell'applicazione.
    • BASE_IMAGE con l'URL dell'immagine di base, ad esempio nodejs20 o us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20 Esamina le 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
    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

    Sostituisci:

    • SERVICE con il nome del servizio in cui vuoi eseguire il deployment.
    • APP_IMAGE con l'URL dell'immagine del container dell'applicazione.
    • BASE_IMAGE con l'URL dell'immagine di base, ad esempio us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20. Consulta la sezione Immagini di base del runtime per scoprire di più sulle varianti delle immagini di base.

Riassemblare le immagini container per eseguirle localmente

Le immagini container delle applicazioni utilizzate con gli aggiornamenti automatici delle immagini di base sono basate su scratch e non possono essere eseguite all'esterno di Cloud Run con gli aggiornamenti delle immagini di base abilitati. Puoi rendere eseguibile l'immagine dell'applicazione eseguendo il rebasing su 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 l'URL di un'immagine di base compatibile. L'elenco delle immagini di base disponibili è disponibile nelle immagini di base dei buildpack di Google Cloud. Ad esempio, se hai creato un'applicazione Node.JS 20 utilizzando lo stack google-22, seleziona us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest.
  4. Ricomponi l'immagine:

    Usa 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 rimontata.

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

    docker run -p 8080:8080 IMAGE
    

Disattivare gli aggiornamenti automatici

Quando esegui il deployment dal codice sorgente

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

gcloud

gcloud beta run deploy SERVICE \
    --source . \
    --base-image nodejs20 \
    --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 da zero, devi eseguire il deployment di una nuova immagine container che includa l'immagine di base e rimuoverla:

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 il seguente comando:

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

    Sostituisci:

    • SERVICE con il nome del servizio in cui vuoi eseguire il deployment.
    • IMAGE con l'URL dell'immagine del contenitore 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 del contenitore 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

Limitazioni note

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

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

  • Le analisi di sicurezza dell'immagine dell'applicazione potrebbero essere incomplete. Poiché l'immagine dell'applicazione è ora basata su scratch, gli scanner di sicurezza scansioneranno solo la parte dell'applicazione dell'immagine. Per avere un quadro più completo della sicurezza del contenitore, devi eseguire le scansioni anche sull'immagine di base corrispondente fornita da Google. Puoi scaricare l'immagine di base e utilizzare gli strumenti open source per eseguire una scansione.