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:
- Utilizza Cloud Run per il deployment dall'origine (consigliato)
- Utilizzando un sistema di compilazione, copia la tua applicazione
scratch
immagine
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:
- Crea un Dockerfile a più fasi che:
- Crea l'applicazione utilizzando un'immagine di base appropriata con i campi delle dipendenze.
- Copia i componenti integrati su un'immagine di graffi.
- Crea l'immagine container dell'applicazione ed eseguine il push ad Artifact Registry.
- 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
-
In the Google Cloud console, 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.
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
ous-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
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
Aggiorna
runtimeClassName
e le annotazionirun.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.
Installa Docker Community Edition (CE) sulla tua workstation.
Scarica l'immagine dell'applicazione
docker pull APP_IMAGE
Sostituisci:
- APP_IMAGE con l'URL dell'immagine del container.
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
, selezionaus-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest
.
- 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
Ricomponi l'immagine
pack
CLI
Installa l'interfaccia a riga di comando Paket.
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
-
In the Google Cloud console, 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.
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
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
Elimina l'annotazione
run.googleapis.com/base-images
.Elimina l'attributo
runtimeClassName
.In
image
, assicurati di utilizzare un'immagine del contenitore che includa l'app, il runtime e il sistema operativo.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.