Configura gli aggiornamenti automatici delle immagini di base

La configurazione degli aggiornamenti automatici delle immagini di base per Cloud Run abilita Google per implementare patch di sicurezza per il sistema operativo e i componenti di runtime automaticamente l'immagine dell'applicazione. Non è necessario ricreare o rieseguire il deployment completamente gestito di Google Cloud.

Per configurare gli aggiornamenti automatici delle immagini di base:

  • Seleziona un'immagine di base Cloud Run compatibile.
  • Crea ed esegui il deployment della tua immagine dell'applicazione in modo che preserva la capacità di 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 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 si basano in cima alla distribuzione di Ubuntu Linux.

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

Quando scegli i buildpack di Google Cloud, devi tenere in considerazione quanto segue:

  • Stack: uno stack è costituito da una versione di distribuzione e da un sistema Linux come OpenSSL e curl
  • Lingua: la versione specifica del linguaggio di programmazione utilizzato dall' applicazione

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

Creazione dell'immagine dell'applicazione

Per i servizi con aggiornamenti automatici attivi è necessario fornire un'applicazione che omette i livelli del sistema operativo di base. Puoi farlo in due modi questo:

Esegui il deployment dall'origine

Puoi utilizzare Cloud Run la funzionalità di deployment dall'origine per creare eseguire il deployment del codice in modo che il servizio sia compatibile con la ricezione di aggiornamenti automatici. A questo scopo, 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

Crea su 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 delle immagini di base, l'immagine container dell'applicazione è 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 a più fasi che:
    1. Crea l'applicazione utilizzando un'immagine di base appropriata con i campi delle dipendenze.
    2. Copia i componenti integrati su un'immagine di graffi.
  2. Crea l'immagine container dell'applicazione ed eseguine il push ad 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 riguarda un linguaggio specifici e possono essere personalizzati in base alla tua applicazione e alla tua lingua.

  • Crea un Dockerfile nella directory root del nostro progetto con il seguenti:

    # 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
    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.

Immagine della creazione dell'applicazione

Crea l'immagine dell'applicazione e caricala in Artifact Registry. Consulta la creazione container per maggiori dettagli su come creare Dockerfile con Cloud Build e caricarlo in Artifact Registry.

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. Utilizzeremo il runtime Node.js 20 da us-central1 per questo esempio. 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 Eseguire il deployment di 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 container dell'applicazione.
    • BASE_IMAGE con l'URL della tua immagine di base, ad esempio nodejs20 o us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20 Per scoprire di più sulle varianti delle immagini di base, consulta Immagini base di runtime.

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

pack CLI

  1. Installa l'interfaccia a riga di comando Paket.

  2. Utilizza pack rebase per combinare le immagini:

    pack rebase $APP_IMAGE \
        --run-image=$NEW_BASE_IMAGE \
        --force
    

Docker

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 \
    .

Disattivare gli aggiornamenti automatici

Durante il deployment dall'origine

Quando esegui il deployment dall'origine, puoi disattivare le di base degli aggiornamenti delle immagini usando il flag --no-automatic-updates. Le seguenti un esempio mostra come disabilitare gli aggiornamenti automatici delle immagini di base per un servizio Node.js:

gcloud

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

Durante il deployment di un'immagine container

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

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 disabilitare gli aggiornamenti automatici delle immagini di base, esegui questo 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 immagini di base personali.

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

  • Le analisi della sicurezza sull'immagine dell'applicazione potrebbero essere incomplete. Poiché la tua l'immagine dell'applicazione è ora basata su scratch, gli scanner di sicurezza analizzeranno solo della parte dell'immagine relativa all'applicazione. Per avere un'immagine più completa del tuo del container, devi eseguire scansioni sulla anche un'immagine di base fornita da Google. Puoi scaricare l'immagine di base e utilizzare gli strumenti open source per eseguire una scansione.