Dienste mit Compose bereitstellen

Auf dieser Seite wird beschrieben, wie Sie Dienste in Cloud Run mit einer Datei bereitstellen, die auf der Compose-Spezifikation basiert.

Sie können mit einer Compose-Datei auf folgende Arten in Cloud Run bereitstellen:

Die Bereitstellung in Cloud Run mit Compose ist ideal für die Entwicklung und vereinfacht den Übergang von Ihrer lokalen Umgebung zu einer Cloud-Umgebung. So können Sie ein einheitliches Konfigurationsformat für Ihre lokalen und bereitgestellten Anwendungen beibehalten.

Für die Verwaltung von Produktionsumgebungen in einer Infrastruktur-als-Code-Umgebung (Infrastructure as Code, IaC) empfehlen wir die Verwendung von Terraform.

Beschränkungen

  • Bei der Compose-Bereitstellung wird ein einzelner Cloud Run-Dienst mit mehreren Containern bereitgestellt.
  • Bei der Compose-Bereitstellung wird nur eine Teilmenge der unterstützten Cloud Run-Funktionen übersetzt.
  • Für mit Compose erstellte Dienste ist standardmäßig eine maximale Anzahl von 1 Instanzen festgelegt.
  • Die Compose-Bereitstellung in Cloud Run vereinfacht zwar die Bereitstellung, ersetzt aber keine umfassende Infrastruktur-als-Code-Strategie für Produktionsumgebungen.

Dienste aus Container-Images mit Compose bereitstellen

Definieren Sie Ihre Dienste in einer compose.yaml-Datei und stellen Sie sie aus vorhandenen Container-Images bereit. Weitere Informationen finden Sie unter Container-Images bereitstellen.

Beispiel: Anwendung mit einem einzelnen Dienst

Das folgende Beispiel zeigt eine compose.yaml-Datei für einen Webdienst, der ein vordefiniertes Container-Image verwendet.

services:
  web:
    image: us-docker.pkg.dev/cloudrun/container/hello
    ports:
      - "8080:8080"

Beispiel: Anwendung mit mehreren Containern mit Nginx, Flask und MongoDB

Das folgende Beispiel zeigt eine compose.yaml-Datei für eine Anwendung mit einem Nginx-Proxy, einem Flask-Backend und einer MongoDB-Datenbank.

Für die Bereitstellung dieses Beispiels ist die folgende Projektstruktur erforderlich:

  • compose.yaml: Die Compose-Datei, in der die Dienste definiert sind.
  • nginx/nginx.conf: Konfiguration für den Nginx-Proxy.
  • flask/: Verzeichnis mit dem Flask-Anwendungscode (server.py, Dockerfile und requirements.txt).
services:
  web:
    image: nginx
    volumes:
      - ./nginx/nginx.conf:/tmp/nginx.conf
    environment:
      - FLASK_SERVER_ADDR=backend:9091
    command: /bin/bash -c "envsubst < /tmp/nginx.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
      - 80:80
    x-google-cloudrun:
      ingress-container: true
    depends_on:
      - backend

  backend:
    build:
      context: flask
      target: builder
    stop_signal: SIGINT
    environment:
      - FLASK_SERVER_PORT=9091
    volumes:
      - ./flask:/src
    depends_on:
      -  mongo
    ports:
      - 9091:9091

  mongo:
    image: mongo
    ports:
      - 27017:27017

Dienste bereitstellen

  1. Führen Sie den Befehl gcloud run compose up aus, um die Dienste bereitzustellen:

    gcloud run compose up compose.yaml

  2. Antworten Sie mit y auf alle Aufforderungen, die erforderlichen Komponenten zu installieren oder APIs zu aktivieren.

  3. Optional: Veröffentlichen Sie Ihren Dienst , wenn Sie den nicht authentifizierten Zugriff auf den Dienst zulassen möchten.

    Nach der Bereitstellung wird die Cloud Run-Dienst-URL angezeigt. Kopieren Sie diese URL und fügen Sie sie in Ihren Browser ein, um den ausgeführten Container aufzurufen. Sie können die Standardauthentifizierung in der Google Cloud Console deaktivieren.

Aus Quellcode mit Compose bereitstellen

Definieren Sie Ihre Dienste in einer compose.yaml-Datei und stellen Sie sie bereit, indem Sie sie aus Quellcode erstellen. Weitere Informationen finden Sie unter Dienste aus Quellcode bereitstellen.

Beispiel: Anwendung mit einem einzelnen Dienst

Das folgende Beispiel zeigt eine compose.yaml-Datei für einen Webdienst, der aus Quellcode im aktuellen Verzeichnis erstellt wird.

services:
  web:
    build: .
    ports:
      - "8080:8080"

Dienste bereitstellen

  • Erstellen Sie in Ihrem Projektverzeichnis eine compose.yaml-Datei mit Ihren Dienstdefinitionen.

    1. Führen Sie den Befehl gcloud run compose up aus, um die Dienste bereitzustellen:

      gcloud run compose up compose.yaml
    2. Antworten Sie mit y auf alle Aufforderungen, die erforderlichen Komponenten zu installieren oder APIs zu aktivieren.

    3. Optional: Veröffentlichen Sie Ihren Dienst wenn Sie den nicht authentifizierten Zugriff auf den Dienst zulassen möchten.

    Nach der Bereitstellung wird die Cloud Run-Dienst-URL angezeigt. Kopieren Sie diese URL und fügen Sie sie in Ihren Browser ein, um den ausgeführten Container aufzurufen. Sie können die Standardauthentifizierung in der Google Cloud Console deaktivieren.

Neuer Build erzwingen

Standardmäßig überspringt die Compose-Bereitstellung in Cloud Run den Build-Prozess, wenn sich der Quellcode seit dem letzten Build nicht geändert hat. Wenn Sie einen neuen Build für alle Dienste erzwingen möchten, die mit einer build Konfiguration definiert wurden, verwenden Sie das --build Flag so:

gcloud run compose up compose.yaml --build

Dies ist besonders nützlich, wenn ein Remote-Repository, ein Image oder ein Digest gelöscht wurde, Ihr lokaler Quellcode aber gleich geblieben ist. Die Flags --build und --no-build schließen sich gegenseitig aus.

Unterstützte Features

Wenn Sie mit einer compose.yaml-Datei bereitstellen, kann Cloud Run automatisch andere Google Cloud Ressourcen bereitstellen, die in Ihrer Compose-Datei definiert sind. Wenn Ressourcen erforderlich sind, werden Sie von Cloud Run um Ihre Zustimmung gebeten, bevor sie erstellt werden.

Cloud Run unterstützt die folgende Teilmenge der Compose-Features:

Compose-Feld Cloud Run-Zuordnung und -Beschreibung
services

Dienste werden einzelnen Containern im bereitgestellten Cloud Run-Dienst zugeordnet.

volumes

Teilweise unterstützt. Übersetzt bind-Mounts, volume-Mounts und tmpfs-Mounts in Cloud Run-Entsprechungen.

secrets

Unterstützt. Verwendet Secret Manager.

configs

Unterstützt. Verwendet Cloud Storage.

build

Unterstützt. Erstellt den Container mit dem Build-Kontext, taggt ihn und überträgt ihn per Push in das Repository cloud-run-source-deploy in Artifact Registry. Verwenden Sie das Flag --build, um einen neuen Build zu erzwingen, auch wenn sich der Quellcode seit dem letzten Build nicht geändert hat.

image

Stellt ein vordefiniertes Container-Image aus einer unterstützten Registry bereit. Verwenden Sie diese Option, wenn Sie ein vordefiniertes Image haben. Unterstützt nur Docker Hub- und Artifact Registry-Images. Bei benutzerdefinierten Images können Sie Images in Artifact Registry übertragen und sie verwenden.

ports

Eine Liste von Portzuordnungen wie 8080:8080, die den Ingress-Container bestimmen.

expose

Eine Liste der Ports, die verfügbar gemacht, aber nicht veröffentlicht werden sollen, z. B. 3000. So wird sichergestellt, dass abhängigen Diensten ein Port für die Kommunikation zur Verfügung steht.

depends_on

Definiert die Startreihenfolge der Container. So wird sichergestellt, dass für jeden in run-compose aufgeführten Dienst ein Port definiert ist, entweder mit ports oder expose, damit andere Container mit ihm kommunizieren können.

cpus

Ein Hinweis zum Festlegen von CPU- und Arbeitsspeicherlimits für Cloud Run. Ressourcen werden automatisch nach der folgenden Logik zugewiesen:

  • <= 2 CPU: 1Gi Memory
  • <= 4 CPU: 2Gi Memory
  • > 4 CPU: 4Gi Memory
container_name

Legt den Namen des Containers für die Auflösung von Abhängigkeiten fest. Wenn nichts angegeben ist, wird standardmäßig der Dienstname verwendet.

environment

Übergibt Umgebungsvariablen an den entsprechenden Container in Cloud Run.

command

Überschreibt den Standardbefehl des Containers, der vom Container deklariert wird, indem er dem Attribut args in Cloud Run zugeordnet wird, z. B. die CMD-Anweisung eines Dockerfile.

entrypoint

Unterstützt.

env_file

Unterstützt.

x-google-cloudrun:ingress-container

(Erweiterung) Fügen Sie diese Google-spezifische Erweiterung einem Dienst hinzu und legen Sie sie auf true fest, um sie als Ingress-Container zu kennzeichnen, der den gesamten externen Traffic empfängt.

x-google-cloudrun:volume-type: in-memory

(Erweiterung) Fügen Sie diese Google-spezifische Erweiterung einem Volume hinzu und legen Sie sie auf in-memory fest, anstatt das Standard-Volume zu verwenden, das von Cloud Storage unterstützt wird.

Secrets, die Secret Manager zugeordnet sind

Wenn in Ihrer compose.yaml-Datei secrets definiert sind, stellt die gcloud CLI Secret Manager-Secrets bereit, um diese Daten zu speichern.

Volumes und Konfigurationen, die Cloud Storage zugeordnet sind

Wenn in Ihrer compose.yaml-Datei volumes oder configs auf oberster Ebene definiert sind, stellt die gcloud CLI einen Cloud Storage-Bucket bereit, um diese Daten zu verwalten. Pro Bereitstellung wird ein einzelner Bucket erstellt, wobei Volumes und Konfigurationen durch Ordner getrennt werden.

  • Benannte Volumes: Im Bucket wird ein leerer Ordner mit dem Namen des Volumes erstellt.
  • Bind-Mounts: Bei Bind-Mounts lädt Cloud Run die Inhalte des lokalen Quellverzeichnisses vor der Bereitstellung in einen Ordner im Bucket hoch.
  • Konfigurationen: Für jede Konfiguration, die mit einer file: Quelle definiert ist, lädt Cloud Run die Inhalte der lokalen Datei in einen Ordner im Bucket hoch.

Erforderliche Rollen

Während der Bereitstellung gewährt Cloud Run der Dienstidentität des bereitgestellten Dienstes automatisch die erforderlichen Rollen für den Zugriff auf bereitgestellte Ressourcen:

  • Cloud Storage-Bucket: roles/storage.objectUser
  • Secret Manager-Secrets: roles/secretmanager.secretAccessor

Kommunikation zwischen Containern derselben Instanz

Cloud Run fügt in jedem Container einen Eintrag zur Datei /etc/hosts hinzu. Dieser Eintrag ordnet die Dienstnamen aus Ihrer compose.yaml-Datei ihren internen IP-Adressen zu. So können Dienste über ihre Dienstnamen miteinander kommunizieren.

Nächste Schritte