Automatische Basis-Image-Updates konfigurieren

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.

Cloud Run-Basis-Image-Diagramm

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:

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:

  1. Erstellen Sie ein mehrstufiges Dockerfile mit den folgenden Eigenschaften:
    1. Die Anwendung wird mit einem geeigneten Basis-Image mit den erforderlichen Abhängigkeiten erstellt.
    2. Kopiert die erstellten Komponenten in ein Scratch-Image.
  2. Erstellen Sie das Anwendungscontainer-Image und übertragen Sie es per Push an Artifact Registry.
  3. 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

  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. 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. nodejs22 oder europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22 Weitere Informationen zu Basis-Images für die Laufzeit
  3. YAML

    1. 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
    2. Aktualisieren Sie runtimeClassName und die run.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.

    Terraform

    Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

    Fügen Sie einer google_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:

    • 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:latest Wenn Sie Artifact Registry verwenden, muss das Repository REPO_NAME bereits erstellt sein. Die URL hat das Format LOCATION-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.

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.

  1. Installieren Sie die Docker Community Edition (CE) auf Ihrer Workstation.

  2. Laden Sie das Anwendungs-Image herunter:

    docker pull APP_IMAGE
    

    Ersetzen Sie APP_IMAGE durch die URL Ihres Container-Image.

  3. Laden Sie das Basis-Image herunter:

    docker pull BASE_IMAGE
    

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

  4. Bild wieder zusammensetzen:

    Kopieren Sie mit einem Dockerfile alle 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} und ARG ${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

  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. 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.
  3. YAML

    1. 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
    2. Löschen Sie die Anmerkung run.googleapis.com/base-images.

    3. Löschen Sie das runtimeClassName-Attribut.

    4. Verwenden Sie in image ein Container-Image, das die App, die Laufzeit und das Betriebssystem enthält.

    5. Erstellen oder aktualisieren Sie den Dienst mit dem folgenden Befehl:

      gcloud run services replace service.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 scratch basiert, 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.