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.

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

So konfigurieren Sie automatische Updates für Basis-Images:

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.

Die Buildpacks von Google Cloud veröffentlichen und verwalten Basis-Images zum Erstellen serverloser Anwendungen. Diese Basis-Images basieren auf der Ubuntu-Linux-Distribution.

Cloud Run unterstützt nur automatische Basis-Images, die die Basis-Images von Google Cloud für Buildpacks verwenden.

Beachten Sie bei der Auswahl von Buildpacks von Google Cloud Folgendes:

  • 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

Dienste mit aktivierten automatischen Updates müssen ein Anwendungs-Image bereitstellen, in dem die Basisbetriebssystemebenen weggelassen werden. Dazu gibt es zwei mögliche Vorgehensweisen:

Über Quelle bereitstellen

Mit der Cloud Run-Funktion Aus der Quelle bereitstellen 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 oder eine Node.js-Funktion mit aktivierten automatischen Basis-Image-Updates bereitstellen möchten, verwenden Sie den folgenden Befehl:

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

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

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. In diesem Beispiel verwenden wir die Node.js 20-Laufzeit von us-central1. Weitere Informationen zu Basis-Image-Varianten finden Sie unter Laufzeit-Basis-Images.

Weitere Informationen zu den erforderlichen Rollen und Berechtigungen finden Sie unter Container-Images in Cloud Run 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 Node.js 20-Laufzeit beim Bereitstellen Ihres Anwendungs-Images zu aktivieren:

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

    Ersetzen Sie:

    • SERVICE durch den Namen des Dienstes, für den Sie die Bereitstellung vornehmen möchten.
    • APP_IMAGE durch die URL Ihres Anwendungs-Container-Images.
    • BASE_IMAGE mit der URL Ihres Basis-Images, z. B. nodejs20 oder us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20 Weitere Informationen zu Basis-Images für die Laufzeit

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

    Ersetzen Sie:

    • SERVICE durch den Namen des Dienstes, für den Sie die Bereitstellung vornehmen möchten.
    • APP_IMAGE durch die URL Ihres Anwendungs-Container-Images.
    • BASE_IMAGE durch die URL Ihres Basis-Images, z. B. us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20. Weitere Informationen zu Basisbildvarianten 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-Images.
  3. Laden Sie das Basis-Image herunter:

    docker pull BASE_IMAGE
    

    Ersetzen Sie:

    • BASE_IMAGE durch die URL eines kompatiblen Basis-Images. Eine Liste der verfügbaren Basis-Images finden Sie unter Buildpack-Basis-Images von Google Cloud. Wenn Sie beispielsweise eine Node.js 20-Anwendung mit dem google-22-Stack erstellt haben, wählen Sie us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest aus.
  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 beta run deploy SERVICE \
    --source . \
    --base-image nodejs20 \
    --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 beta run deploy SERVICE \
        --image IMAGE \
        --base-image ""

    Ersetzen Sie:

    • SERVICE durch den Namen des Dienstes, für den Sie die Bereitstellung vornehmen möchten.
    • IMAGE durch die URL Ihres Container-Images mit der App, der Laufzeit und dem Betriebssystem.

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

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.

  • Die Sicherheitsprüfungen Ihres Anwendungs-Images sind möglicherweise unvollständig. Da Ihr Anwendungs-Image jetzt auf scratch basiert, scannen Sicherheitsscanner nur den Anwendungsteil des Images. Um ein vollständigeres Bild Ihrer Containersicherheit zu erhalten, müssen Sie auch Scans auf dem entsprechenden von Google bereitgestellten Basis-Image ausführen. Sie können das Basisbild herunterladen und mit Open-Source-Tools einen Scan ausführen.