Wenn Sie automatische Basis-Image-Aktualisierungen für Cloud Run konfigurieren, kann Google automatisch Sicherheits-Patches für die Betriebssystem- und Sprachlaufzeitkomponenten des Basis-Images anwenden. Sie müssen den Dienst nicht neu erstellen oder neu bereitstellen, damit das Basis-Image aktualisiert wird. Wenn das Basis-Image aktualisiert wird, wird keine neue Version erstellt.
Informationen zum Festlegen von Richtlinien für Sicherheitsupdates für Funktionen, die mit gcloud functions-Befehlen oder der Cloud Functions v2 API erstellt wurden, finden Sie unter Sicherheit der Ausführungsumgebung.
Das folgende Diagramm zeigt, wie der Anwendungscode und die Abhängigkeiten („App-Image“) über der Sprachlaufzeit, den Betriebssystempaketen und dem Betriebssystem („Basis-Image“) angeordnet sind. Die Komponenten des Basis-Images werden automatisch von Google aktualisiert.
Richtlinie für Sicherheitsupdates
Automatische Updates: Aktualisierungen und Sicherheitspatches für die Laufzeitumgebung werden in neuen Versionen des Laufzeit-Images veröffentlicht. Nach einem Testzeitraum, der auf Stabilität und Zuverlässigkeit prüft, wird die aktualisierte Laufzeit für alle Dienste eingeführt, was zu einer Aktualisierung ohne Ausfallzeiten führt. Wenn Sie Sicherheitsupdates auf Sprachebene übernehmen möchten, müssen Sie möglicherweise Funktionen oder Dienste neu erstellen, die kompilierte Sprachen wie Go oder Java verwenden.
Bei Bereitstellungsupdates: werden Aktualisierungen und Sicherheitspatches nur dann auf Laufzeiten angewendet, wenn Dienste bereitgestellt oder neu bereitgestellt werden, sofern nicht anders angegeben. Aktualisierungen für die Bereitstellung sind sowohl für Cloud Run-Funktionen der 1. Generation als auch für Cloud Run-Funktionen verfügbar.
Automatische Sicherheitsupdates sind standardmäßig für Funktionen aktiviert, die mit folgenden Tools bereitgestellt werden:
gcloud functions- Cloud Functions v2 API
gcloud runmit dem Flag--functionsund dem Flag--base-image
Automatische Updates für Basis-Images konfigurieren
So konfigurieren Sie automatische Updates für Basis-Images:
- Wählen Sie ein kompatibles Cloud Run-Basis-Image aus.
- Erstellen und Bereitstellen Ihres Anwendungs-Images, sodass die Möglichkeit erhalten bleibt, Ihren laufenden Dienst sicher neu zu starten.
Basis-Image auswählen
Das Basis-Image ist der Ausgangspunkt für die meisten containerbasierten Entwicklungsworkflows. Entwickler beginnen mit einem Basis-Image und fügen dann die erforderlichen Bibliotheken, Binärdateien und Konfigurationsdateien hinzu, die zum Ausführen ihrer Anwendung verwendet werden.
Buildpacks von Google Cloud veröffentlicht und verwaltet Basis-Images zum Erstellen serverloser Anwendungen. Diese Basis-Images basieren auf der Ubuntu-Linux-Distribution.
Cloud Run unterstützt nur automatische Basis-Images, die Buildpack-Basis-Images von Google Cloud verwenden.
Bei der Auswahl eines Basis-Images für Buildpacks müssen Sie Folgendes berücksichtigen:
- Stack: Ein Stack besteht aus einer Linux-Distributionsversion und Systempaketen wie OpenSSL und curl.
- Language: Die spezifische Version der Programmiersprache, die von Ihrer Anwendung verwendet wird.
Weitere Informationen zu Basisbildvarianten finden Sie unter Laufzeit-Basisbilder.
Anwendungs-Image erstellen
Für Dienste mit aktivierten automatischen Updates muss ein Anwendungs-Image bereitgestellt werden, in dem die Basisbetriebssystemebenen fehlen. Dazu gibt es zwei mögliche Vorgehensweisen:
- Cloud Run-Bereitstellung aus Quelle verwenden (empfohlen)
- Kopieren Sie Ihre Anwendung mit einem Build-System in ein
scratch-Image.
Über Quelle bereitstellen
Mit der Cloud Run-Option Quellcodebereitstellung können Sie Ihren Code erstellen und bereitstellen, damit Ihr Dienst automatische Updates empfangen kann. Dazu müssen Sie beim Erstellen der Anwendung das Flag --base-image angeben.
Wenn Sie beispielsweise einen Node.js-Dienst mit aktivierten automatischen Basis-Image-Updates bereitstellen möchten, verwenden Sie den folgenden Befehl:
gcloud run deploy \
--source . \
--base-image nodejs22 \
--automatic-updates
Wenn Sie eine Funktion bereitstellen möchten, müssen Sie das Flag --function mit dem Funktionseinstiegspunkt aus Ihrem Quellcode angeben.
Build on scratch
Sie können auch Ihre Build-Toolchain verwenden, um ein Anwendungscontainer-Image zu erstellen, das mit automatischen Basis-Image-Aktualisierungen kompatibel ist.
Wenn Sie einen Cloud Run-Dienst mit automatischen Basis-Image-Aktualisierungen bereitstellen, wird das Anwendungscontainer-Image auf ein Basiscontainer-Image aufgesetzt. Das Anwendungscontainer-Image sollte nur Ihre Anwendung enthalten, nicht das Betriebssystem oder die Laufzeit, die im Basiscontainer-Image bereitgestellt werden.
So erstellen Sie das Anwendungscontainer-Image:
- Erstellen Sie ein mehrstufiges Dockerfile mit den folgenden Eigenschaften:
- Die Anwendung wird mit einem geeigneten Basis-Image mit den erforderlichen Abhängigkeiten erstellt.
- Kopiert die erstellten Komponenten in ein Scratch-Image.
- Erstellen Sie das Anwendungscontainer-Image und übertragen Sie es per Push an Artifact Registry.
- Stellen Sie das Anwendungscontainer-Image in Cloud Run bereit und geben Sie ein Basis-Image an.
Mehrstufiges Dockerfile erstellen
In dieser Anleitung verwenden wir eine Node.js-Anwendung. Dieser Leitfaden ist nicht sprachspezifisch und kann für Ihre Anwendung und Sprache angepasst werden.
Erstellen Sie im Stammverzeichnis unseres Projekts eine
Dockerfile-Datei mit folgendem Inhalt:# 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:22-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" ]
Dieses Dockerfile verwendet einen mehrstufigen Build, um den Quellcode und die Abhängigkeiten der Anwendung in ein scratch-Image zu kopieren, bei dem das Betriebssystem, die Pakete und Laufzeitkomponenten weggelassen und erst zur Laufzeit vom verwalteten Cloud Run-Basis-Image bereitgestellt werden.
Anwendungs-Image erstellen
Erstellen Sie das Anwendungs-Image und laden Sie es in Artifact Registry hoch. Unter Container erstellen finden Sie weitere Informationen dazu, wie Sie eine Dockerfile mit Cloud Build erstellen und in die Artifact Registry hochladen.
Anwendungs-Image bereitstellen
Sie können jetzt Ihr Anwendungs-Image mit aktivierten automatischen Updates mit dem kompatibelsten Basis-Image für Ihre Anwendung bereitstellen. Im folgenden Beispiel werden die Laufzeit nodejs22 und die Region europe-west1 verwendet. Weitere Informationen zu Basis-Image-Varianten finden Sie unter Laufzeit-Basis-Images.
Weitere Informationen zu den erforderlichen Rollen und Berechtigungen finden Sie unter Aus Quellcode bereitstellen.
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.
Führen Sie den folgenden Befehl aus, um automatische Updates für die
nodejs22-Laufzeit beim Bereitstellen Ihres Anwendungs-Images zu aktivieren:gcloud run deploy SERVICE \ --image APP_IMAGE \ --base-image BASE_IMAGE
Ersetzen Sie Folgendes:
- SERVICE: Der Name des Dienstes, in dem Sie die Bereitstellung vornehmen möchten.
- APP_IMAGE: die URL Ihres Anwendungscontainer-Images.
- BASE_IMAGE: die URL Ihres Basis-Images, z. B.
nodejs22odereurope-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22Weitere Informationen zu Basis-Images für die Laufzeit
Wenn Sie einen neuen Dienst erstellen, überspringen Sie diesen Schritt. Wenn Sie einen vorhandenen Dienst aktualisieren, laden Sie die zugehörige YAML-Konfiguration herunter:
gcloud run services describe SERVICE --format export > service.yaml
Aktualisieren Sie
runtimeClassNameund dierun.googleapis.com/base-images-Anmerkungen: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
Ersetzen Sie Folgendes:
- SERVICE: Der Name des Dienstes, in dem Sie die Bereitstellung vornehmen möchten.
- APP_IMAGE: die URL Ihres Anwendungscontainer-Images.
- BASE_IMAGE: die URL Ihres Basis-Images, z. B.
europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Weitere Informationen zu Basis-Image-Varianten finden Sie unter Laufzeit-Basis-Images.
- SERVICE: Der Name des Dienstes, in dem Sie die Bereitstellung vornehmen möchten.
- REGION: die Google Cloud Region.
- IMAGE_URL: ein Verweis auf das Container-Image, z. B.
us-docker.pkg.dev/cloudrun/container/hello:latestWenn Sie Artifact Registry verwenden, muss das Repository REPO_NAME bereits erstellt sein. Die URL hat das FormatLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG. - BASE_IMAGE: die URL Ihres Basis-Images, z. B.
us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Weitere Informationen zu Basis-Image-Varianten finden Sie unter Laufzeit-Basis-Images.
YAML
Terraform
Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.
Fügen Sie einergoogle_cloud_run_v2_service-Ressource in Ihrer Terraform-Konfiguration Folgendes hinzu:resource "google_cloud_run_v2_service" "default" {
provider = google-beta
name = "SERVICE"
location = "REGION"
template {
containers {
image = "IMAGE_URL"
base_image_uri = "BASE_IMAGE"
}
}
}
Ersetzen Sie Folgendes:
Container-Images für die lokale Ausführung neu zusammenstellen
Anwendungscontainer-Images, die mit automatischen Basis-Image-Updates verwendet werden, basieren auf scratch und können nicht außerhalb von Cloud Run ausgeführt werden, wenn Basis-Image-Updates aktiviert sind.
Sie können Ihr Anwendungs-Image ausführbar machen, indem Sie es auf einem kompatiblen Basis-Image neu ausrichten.
Installieren Sie die Docker Community Edition (CE) auf Ihrer Workstation.
Laden Sie das Anwendungs-Image herunter:
docker pull APP_IMAGEErsetzen Sie APP_IMAGE durch die URL Ihres Container-Image.
Laden Sie das Basis-Image herunter:
docker pull BASE_IMAGEErsetzen Sie BASE_IMAGE durch den vollständigen Bildpfad eines kompatiblen Basis-Images. Eine Liste der verfügbaren Basis-Images finden Sie unter Buildpack-Basis-Images von Google Cloud.
Bild wieder zusammensetzen:
Kopieren Sie mit einem
Dockerfilealle Dateien aus dem App-Image zurück in das Basis-Image: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 / /Erstellen Sie das Image:
docker build \ -t IMAGE \ --build-arg APP_IMAGE=APP_IMAGE \ --build-arg NEW_BASE_IMAGE=BASE_IMAGE \ .Ersetzen Sie IMAGE durch den Namen des neu zusammengesetzten Images.
Wenn Sie Warnungen erhalten, dass
ARG ${APP_IMAGE}undARG ${NEW_BASE_IMAGE}keine gültigen Basis-Images sind, können Sie diese ignorieren und das Image ausführen:docker run -p 8080:8080 IMAGE
Automatische Updates deaktivieren
Beim Bereitstellen aus der Quelle
Wenn Sie eine Bereitstellung aus der Quelle ausführen, können Sie automatische Basis-Image-Updates mithilfe des Flags --no-automatic-updates deaktivieren. Im folgenden Beispiel wird gezeigt, wie Sie automatische Basis-Image-Updates für einen Node.js-Dienst deaktivieren:
gcloud
gcloud run deploy SERVICE \ --source . \ --base-image nodejs22 \ --no-automatic-updates
Beim Bereitstellen eines Container-Images
Wenn Sie Basis-Image-Updates für einen Dienst deaktivieren möchten, der ein von Grund auf neu erstelltes Container-Image verwendet, müssen Sie ein neues Container-Image bereitstellen, das das Basis-Image enthält, und das Basis-Image entfernen:
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.
Führen Sie den folgenden Befehl aus, um automatische Updates des Basis-Images zu deaktivieren:
gcloud run deploy SERVICE \ --image IMAGE \ --base-image ""
Ersetzen Sie Folgendes:
- SERVICE: Der Name des Dienstes, in dem Sie die Bereitstellung vornehmen möchten.
- IMAGE: die URL Ihres Container-Images mit der App, der Laufzeit und dem Betriebssystem.
Wenn Sie einen neuen Dienst erstellen, überspringen Sie diesen Schritt. Wenn Sie einen vorhandenen Dienst aktualisieren, laden Sie die zugehörige YAML-Konfiguration herunter:
gcloud run services describe SERVICE --format export > service.yaml
Löschen Sie die Anmerkung
run.googleapis.com/base-images.Löschen Sie das
runtimeClassName-Attribut.Verwenden Sie in
imageein Container-Image, das die App, die Laufzeit und das Betriebssystem enthält.Erstellen oder aktualisieren Sie den Dienst mit dem folgenden Befehl:
gcloud run services replace service.yaml
YAML
Basis-Image-Version ansehen
Die Version des Basis-Images, das zum Bereitstellen Ihrer Anwendung verwendet wird, finden Sie in den Cloud Run-Dienstlogs in der LogEntry.labels.run.googleapis.com/base_image_versions-Ressource.
Bekannte Einschränkungen
Automatische Basis-Image-Updates werden nur für Buildpack-Basis-Images von Google Cloud unterstützt. Es ist nicht möglich, eigene Basis-Images zu verwenden.
Anwendungen, die kompilierte Sprachen verwenden, werden durch ein automatisches Basis-Image-Update nicht neu kompiliert.
Sicherheitsüberprüfungen Ihres Anwendungs-Images sind möglicherweise unvollständig. Da Ihr Anwendungs-Image jetzt auf
scratchbasiert, werden Sicherheitsscanner nur den Anwendungsbereich Ihres Images scannen. Um ein umfassenderes Bild Ihrer Containersicherheit zu erhalten, müssen Sie auch Scans für das entsprechende von Google bereitgestellte Basis-Image ausführen. Sie können das Basis-Image herunterladen und mit Open-Source-Tools einen Scan durchführen.