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.
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.
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:
- 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-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:
- 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 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
-
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 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
oderus-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20
Weitere Informationen zu Basis-Images für die Laufzeit
YAML
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
runtimeClassName
und dierun.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.
Installieren Sie die Docker Community Edition (CE) auf Ihrer Workstation.
Laden Sie das Anwendungs-Image herunter:
docker pull APP_IMAGE
Ersetzen Sie:
- APP_IMAGE durch die URL Ihres Container-Images.
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 Sieus-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest
aus.
- 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
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}
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 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
-
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 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
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
image
ein 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
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.