Kurzanleitung: Erstellen und Bereitstellen

Auf dieser Seite erfahren Sie, wie Sie eine einfache "Hello World"-Anwendung erstellen, sie in ein Container-Image verpacken, das Container-Image in Container Registry hochladen und dieses anschließend für Cloud Run bereitstellen. Es wird gezeigt, wie Sie das Beispiel mit verschiedenen Sprachen ausführen können. Sie können es jedoch auch mit Sprachen ausführen, die hier nicht behandelt werden.

Sie können dieser Kurzanleitung auch mit einem Demokonto auf Qwiklabs folgen.

Vorbereitung

  1. Melden Sie sich bei Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

  2. Wählen Sie in der Cloud Console auf der Seite für die Projektauswahl ein Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Installieren und initialisieren Sie das Cloud SDK.

Beispielanwendung schreiben

Klicken Sie auf den Tab für Ihre Sprache, um Anweisungen zum Erstellen einer "Hello World"-Beispielanwendung zu erhalten, die in Cloud Run ausgeführt wird:

Go

  1. Erstellen Sie ein neues Verzeichnis mit dem Namen helloworld und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

    mkdir helloworld
    cd helloworld
    
  2. Initialisieren Sie eine go.mod-Datei, um das Go-Modul zu deklarieren:

    module github.com/GoogleCloudPlatform/golang-samples/run/helloworld
    
    go 1.13
    
  3. Erstellen Sie eine neue Datei mit dem Namen main.go und fügen Sie den folgenden Code in diese ein:

    
    // Sample run-helloworld is a minimal Cloud Run service.
    package main
    
    import (
    	"fmt"
    	"log"
    	"net/http"
    	"os"
    )
    
    func main() {
    	log.Print("starting server...")
    	http.HandleFunc("/", handler)
    
    	// Determine port for HTTP service.
    	port := os.Getenv("PORT")
    	if port == "" {
    		port = "8080"
    		log.Printf("defaulting to port %s", port)
    	}
    
    	// Start HTTP server.
    	log.Printf("listening on port %s", port)
    	if err := http.ListenAndServe(":"+port, nil); err != nil {
    		log.Fatal(err)
    	}
    }
    
    func handler(w http.ResponseWriter, r *http.Request) {
    	name := os.Getenv("NAME")
    	if name == "" {
    		name = "World"
    	}
    	fmt.Fprintf(w, "Hello %s!\n", name)
    }
    

    Mit diesem Code wird ein einfacher Webserver erstellt, der den von der Umgebungsvariable PORT definierten Port überwacht.

Die Anwendung ist jetzt fertig und kann in einen Container verlagert und dann in Container Registry hochgeladen werden.

Node.js

  1. Erstellen Sie ein neues Verzeichnis mit dem Namen helloworld und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

    mkdir helloworld
    cd helloworld
    
  2. Erstellen Sie eine package.json-Datei mit folgendem Inhalt:

    {
      "name": "helloworld",
      "description": "Simple hello world sample in Node",
      "version": "1.0.0",
      "private": true,
      "main": "index.js",
      "scripts": {
        "start": "node index.js",
        "test": "mocha test/index.test.js --exit",
        "system-test": "NAME=Cloud test/runner.sh mocha test/system.test.js --timeout=30000",
        "lint": "eslint '**/*.js'",
        "fix": "eslint --fix '**/*.js'"
      },
      "author": "Google LLC",
      "license": "Apache-2.0",
      "dependencies": {
        "express": "^4.17.1"
      },
      "devDependencies": {
        "got": "^11.0.0",
        "mocha": "^8.0.0",
        "supertest": "^4.0.2"
      }
    }
    
  3. Erstellen Sie im selben Verzeichnis eine index.js-Datei und kopieren Sie die folgenden Zeilen hinein:

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      const name = process.env.NAME || 'World';
      res.send(`Hello ${name}!`);
    });
    
    const port = process.env.PORT || 8080;
    app.listen(port, () => {
      console.log(`helloworld: listening on port ${port}`);
    });

    Mit diesem Code wird ein einfacher Webserver erstellt, der den von der Umgebungsvariable PORT definierten Port überwacht.

Die Anwendung ist jetzt fertig und kann in einen Container verlagert und dann in Container Registry hochgeladen werden.

Python

  1. Erstellen Sie ein neues Verzeichnis mit dem Namen helloworld und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

    mkdir helloworld
    cd helloworld
    
  2. Erstellen Sie eine Datei mit dem Namen main.py und fügen Sie den folgenden Code in diese ein:

    import os
    
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        name = os.environ.get('NAME', 'World')
        return 'Hello {}!'.format(name)
    
    if __name__ == "__main__":
        app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

    Dieser Code antwortet auf Anfragen mit der Begrüßung "Hello World". Die HTTP-Verarbeitung erfolgt über einen Gunicorn-Webserver im Container. Wenn dieser Code direkt für die lokale Verwendung aufgerufen wird, erstellt er einen einfachen Webserver, der den von der Umgebungsvariable PORT definierten Port überwacht.

Die Anwendung ist jetzt fertig und kann in einen Container verlagert und dann in Container Registry hochgeladen werden.

Java

Erstellen Sie eine Spring Boot-Anwendung.

  1. Erstellen Sie über die Konsole mit den Befehlen "cURL" und "unzip" ein neues, leeres Webprojekt:

    curl https://start.spring.io/starter.zip \
        -d dependencies=web \
        -d javaVersion=1.8 \
        -d bootVersion=2.3.3.RELEASE \
        -d name=helloworld \
        -d artifactId=helloworld \
        -d baseDir=helloworld \
        -o helloworld.zip
    unzip helloworld.zip
    cd helloworld
    

    Dadurch wird ein Spring Boot-Projekt erstellt.

    Um den obigen cURL-Befehl in Microscoft Windows nutzen zu können, verwenden Sie eine der folgenden Befehlszeilen oder optional Spring Initializr (Konfiguration vorab geladen), um das Projekt zu generieren:

  2. Aktualisieren Sie die Klasse HelloworldApplication in src/main/java/com/example/helloworld/HelloworldApplication.java. Fügen Sie dazu @RestController hinzu, um die /-Zuordnung zu verarbeiten, und fügen Sie ein @Value-Feld hinzu, um die NAME-Umgebung bereitzustellen:

    
    package com.example.helloworld;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    public class HelloworldApplication {
    
      @Value("${NAME:World}")
      String name;
    
      @RestController
      class HelloworldController {
        @GetMapping("/")
        String hello() {
          return "Hello " + name + "!";
        }
      }
    
      public static void main(String[] args) {
        SpringApplication.run(HelloworldApplication.class, args);
      }
    }
  3. Legen Sie den Serverport fest, der durch die PORT-Umgebungsvariable in application.properties definiert werden soll:

    server.port=${PORT:8080}

Mit diesem Code wird ein einfacher Webserver erstellt, der den von der Umgebungsvariable PORT definierten Port überwacht.

Die Anwendung ist jetzt fertig und kann in einen Container verlagert und dann in Container Registry hochgeladen werden.

Wenn Sie Java mit anderen Frameworks für Cloud Run bereitstellen möchten, sehen Sie sich die Knative-Beispiele für Spark und Vert.x an.

C#

  1. Installieren Sie das .NET Core SDK 3.1. Dies ist nur erforderlich, damit wir im nächsten Schritt das neue Webprojekt erstellen können; das weiter unten beschriebene Dockerfile lädt dann später alle Abhängigkeiten in den Container.

  2. Erstellen Sie über die Konsole mit dem Befehl "dotnet" ein neues, leeres Webprojekt:

    dotnet new web -o helloworld-csharp
    
  3. Ändern Sie das Verzeichnis in helloworld-csharp.

  4. Aktualisieren Sie die CreateHostBuilder-Definition in Program.cs, um den Port zu überwachen, der durch die Umgebungsvariable PORT definiert ist:

    using System;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Hosting;
    
    namespace helloworld_csharp
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args)
            {
                string port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
                string url = String.Concat("http://0.0.0.0:", port);
    
                return Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>().UseUrls(url);
                    });
            }
        }
    }

    Mit diesem Code wird ein einfacher Webserver erstellt, der den von der Umgebungsvariable PORT definierten Port überwacht.

  5. Erstellen Sie eine Datei mit dem Namen Startup.cs und fügen Sie den folgenden Code in diese ein:

    using System;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    
    namespace helloworld_csharp
    {
        public class Startup
        {
            // This method gets called by the runtime. Use this method to add services to the container.
            // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
            public void ConfigureServices(IServiceCollection services)
            {
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapGet("/", async context =>
                    {
                        var target = Environment.GetEnvironmentVariable("TARGET") ?? "World";
                        await context.Response.WriteAsync($"Hello {target}!\n");
                    });
                });
            }
        }
    }

    Dieser Code antwortet auf Anfragen mit der Begrüßung "Hello World".

Die Anwendung ist jetzt fertig und kann in einen Container verlagert und dann in Container Registry hochgeladen werden.

PHP

  1. Erstellen Sie ein neues Verzeichnis mit dem Namen helloworld-php und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

    mkdir helloworld-php
    cd helloworld-php
    
  2. Erstellen Sie eine Datei mit dem Namen index.php und fügen Sie den folgenden Code in diese ein:

    <?php
    $target = getenv('TARGET', true) ?: 'World';
    echo sprintf("Hello %s!", $target);
    

    Dieser Code antwortet auf Anfragen mit der Begrüßung "Hello World". Die HTTP-Verarbeitung erfolgt über einen Apache-Webserver im Container.

Die Anwendung ist jetzt fertig und kann in einen Container verlagert und dann in Container Registry hochgeladen werden.

Ruby

  1. Erstellen Sie ein neues Verzeichnis mit dem Namen helloworld und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

    mkdir helloworld
    cd helloworld
    
  2. Erstellen Sie eine Datei mit dem Namen app.rb und fügen Sie den folgenden Code in diese ein:

    require "sinatra"
    
    set :bind, "0.0.0.0"
    port = ENV["PORT"] || "8080"
    set :port, port
    
    get "/" do
      name = ENV["NAME"] || "World"
      "Hello #{name}!"
    end

    Mit diesem Code wird ein einfacher Webserver erstellt, der den von der Umgebungsvariable PORT definierten Port überwacht.

  3. Erstellen Sie eine Datei namens Gemfile und kopieren Sie Folgendes hinein:

    source "https://rubygems.org"
    
    gem "sinatra", "~>2.0"
    
    group :test do
      gem "rack-test"
      gem "rest-client"
      gem "rspec"
      gem "rspec_junit_formatter"
      gem "rubysl-securerandom"
    end
    
  4. Wenn Bundler 2.0 oder höher nicht installiert ist, installieren Sie Bundler.

  5. Erstellen Sie mit diesem Befehl eine Gemfile.lock-Datei:

    bundle install

Die Anwendung ist jetzt fertig und kann in einen Container verlagert und dann in Container Registry hochgeladen werden.

Shell

  1. Erstellen Sie ein neues Verzeichnis mit dem Namen helloworld-shell und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

    mkdir helloworld-shell
    cd helloworld-shell
    
  2. Erstellen Sie eine script.sh-Datei mit folgendem Inhalt:

    
    set -e
    echo "Hello ${NAME:-World}!"
    

    In diesem Beispiel wird das Shell-Skript mithilfe eines kleinen Go-Programms, das einen einfachen Webserver startet und den durch die Umgebungsvariable PORT definierten Port überwacht, für alle eingehenden Anfragen ausgeführt.

  3. Erstellen Sie eine invoke.go-Datei mit folgendem Inhalt:

    
    // Sample helloworld-shell is a Cloud Run shell-script-as-a-service.
    package main
    
    import (
    	"log"
    	"net/http"
    	"os"
    	"os/exec"
    )
    
    func main() {
    	http.HandleFunc("/", scriptHandler)
    
    	// Determine port for HTTP service.
    	port := os.Getenv("PORT")
    	if port == "" {
    		port = "8080"
    		log.Printf("Defaulting to port %s", port)
    	}
    
    	// Start HTTP server.
    	log.Printf("Listening on port %s", port)
    	if err := http.ListenAndServe(":"+port, nil); err != nil {
    		log.Fatal(err)
    	}
    }
    
    func scriptHandler(w http.ResponseWriter, r *http.Request) {
    	cmd := exec.CommandContext(r.Context(), "/bin/sh", "script.sh")
    	cmd.Stderr = os.Stderr
    	out, err := cmd.Output()
    	if err != nil {
    		w.WriteHeader(500)
    	}
    	w.Write(out)
    }
    

Die Anwendung ist jetzt fertig und kann in einen Container verlagert und dann in Container Registry hochgeladen werden.

Andere

Cloud Run unterstützt die meisten Sprachen. Einfache Beispiele für Sprachen, die in dieser Tabelle nicht aufgeführt sind, finden Sie unter folgenden Links:

Überspringen Sie bei diesen Beispielen jedoch die Informationen zu service.yaml und Docker Hub, da diese Datei und diese Bibliothek in Cloud Run nicht verwendet werden.

Anwendung containerisieren und in Container Registry hochladen

Erstellen Sie zum Containerisieren der Beispielanwendung in dem Verzeichnis, in dem sich die Quelldateien befinden, eine neue Datei namens Dockerfile und kopieren Sie den folgenden Inhalt in diese:

Go


# Use the offical golang image to create a binary.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.15-buster as builder

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY . ./

# Build the binary.
RUN go build -mod=readonly -v -o server

# Use the official Debian slim image for a lean production container.
# https://hub.docker.com/_/debian
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM debian:buster-slim
RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    ca-certificates && \
    rm -rf /var/lib/apt/lists/*

# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server

# Run the web service on container startup.
CMD ["/app/server"]

Fügen Sie die Datei .dockerignore hinzu, um Dateien aus Ihrem Container-Image auszuschließen.

# The .dockerignore file excludes files from the container build process.
#
# https://docs.docker.com/engine/reference/builder/#dockerignore-file

# Exclude locally vendored dependencies.
vendor/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

Node.js


# Use the official lightweight Node.js 10 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure copying both package.json AND package-lock.json (when available).
# Copying this first prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
# If you add a package-lock.json, speed your build by switching to 'npm ci'.
# RUN npm ci --only=production
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "node", "index.js" ]

Fügen Sie die Datei .dockerignore hinzu, um Dateien aus Ihrem Container-Image auszuschließen.

Dockerfile
.dockerignore
node_modules
npm-debug.log

Python

Das Python-Dockerfile startet einen Gunicorn-Webserver, der den von der Umgebungsvariable PORT definierten Port überwacht:


# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.8-slim

# Allow statements and log messages to immediately appear in the Knative logs
ENV PYTHONUNBUFFERED True

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

# Install production dependencies.
RUN pip install Flask gunicorn

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Fügen Sie die Datei .dockerignore hinzu, um Dateien aus Ihrem Container-Image auszuschließen.

Dockerfile
README.md
*.pyc
*.pyo
*.pyd
__pycache__
.pytest_cache

Java


# Use the official maven/Java 8 image to create a build artifact.
# https://hub.docker.com/_/maven
FROM maven:3.6-jdk-11 as builder

# Copy local code to the container image.
WORKDIR /app
COPY pom.xml .
COPY src ./src

# Build a release artifact.
RUN mvn package -DskipTests

# Use AdoptOpenJDK for base image.
# It's important to use OpenJDK 8u191 or above that has container support enabled.
# https://hub.docker.com/r/adoptopenjdk/openjdk8
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM adoptopenjdk/openjdk11:alpine-slim

# Copy the jar to the production image from the builder stage.
COPY --from=builder /app/target/helloworld-*.jar /helloworld.jar

# Run the web service on container startup.
CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/helloworld.jar"]

Fügen Sie die Datei .dockerignore hinzu, um Dateien aus Ihrem Container-Image auszuschließen.

Dockerfile
.dockerignore
target/

C#

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out

# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine AS runtime
WORKDIR /app
COPY --from=build /app/out ./

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "helloworld-csharp.dll"]

Wenn Sie Dateien aus lokalen dotnet-Build-Vorgängen vom Hochladen in Cloud Build ausschließen möchten, fügen Sie eine .gcloudignore-Datei im selben Verzeichnis hinzu, in dem sich die Quelldateien der Beispielanwendung befinden:

**/obj/
**/bin/

Wenn sich diese Zeilen in einer .gitignore-Datei befinden, können Sie diesen Schritt überspringen, da .gitignore eine Standardquelle für die .gcloudignore-Konfiguration ist.

Kopieren Sie diese Zeilen in eine .dockerignore-Datei für lokale Container-Builds mit der docker-Befehlszeile.

PHP

Das PHP-Dockerfile startet einen Apache-Webserver, der den von der Umgebungsvariablen PORT definierten Port überwacht:

# Use the official PHP 7.3 image.
# https://hub.docker.com/_/php
FROM php:7.3-apache

# Copy local code to the container image.
COPY index.php /var/www/html/

# Use the PORT environment variable in Apache configuration files.
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

# Configure PHP for development.
# Switch to the production php.ini for production operations.
# RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# https://hub.docker.com/_/php#configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

Fügen Sie die Datei .dockerignore hinzu, um Dateien aus Ihrem Container-Image auszuschließen.

Dockerfile
README.md
vendor

Ruby


# Use the official lightweight Ruby image.
# https://hub.docker.com/_/ruby
FROM ruby:2.7-slim

# Install production dependencies.
WORKDIR /usr/src/app
COPY Gemfile Gemfile.lock ./
ENV BUNDLE_FROZEN=true
RUN gem install bundler && bundle install --without test

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD ["ruby", "./app.rb"]

Fügen Sie die Datei .dockerignore hinzu, um Dateien aus Ihrem Container-Image auszuschließen.

Dockerfile
README.md
.ruby-version
.bundle/
vendor/

Shell


# Use the offical golang image to create a binary.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.14-buster as builder

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY invoke.go ./

# Build the binary.
RUN go build -mod=readonly -v -o server

# Use the official Debian slim image for a lean production container.
# https://hub.docker.com/_/debian
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM debian:buster-slim
RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    --no-install-recommends \
    ca-certificates && \
    rm -rf /var/lib/apt/lists/*

# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server
COPY script.sh ./

# Run the web service on container startup.
CMD ["/app/server"]

Andere

Cloud Run unterstützt die meisten Sprachen. Beispiel-Dockerfiles für Sprachen, die in dieser Tabelle nicht aufgeführt sind, finden Sie unter folgenden Links:

Überspringen Sie bei diesen Beispielen jedoch die Informationen zu service.yaml und Docker Hub, da diese Datei und diese Bibliothek in Cloud Run nicht verwendet werden.

Erstellen Sie das Container-Image mit Cloud Build. Dazu führen Sie folgenden Befehl in dem Verzeichnis aus, in dem sich das Dockerfile befindet:

gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld

Dabei ist PROJECT-ID die GCP-Projekt-ID. Sie können sie abrufen, indem Sie gcloud config get-value project ausführen.

Bei Erfolg wird eine SUCCESS-Nachricht mit dem Image-Namen (gcr.io/PROJECT-ID/helloworld) angezeigt. Das Image wird in Container Registry gespeichert und kann bei Bedarf wiederverwendet werden.

In Cloud Run bereitstellen

So stellen Sie das Container-Image bereit:

  1. Stellen Sie es mit dem folgenden Befehl bereit:

    gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed

    Ersetzen Sie PROJECT-ID durch Ihre GCP-Projekt-ID. Sie können Ihre Projekt-ID aufrufen, indem Sie den Befehl gcloud config get-value project ausführen.

    1. Sie werden zur Eingabe des Dienstnamens aufgefordert. Drücken Sie die Eingabetaste, um den Standardnamen helloworld zu akzeptieren.
    2. Sie werden zur Eingabe der Region aufgefordert: Wählen Sie die Region Ihrer Wahl aus, zum Beispiel us-central1.
    3. Sie werden aufgefordert, nicht authentifizierte Aufrufe zuzulassen: Antworten Sie mit y.

    Warten Sie dann einige Sekunden, bis die Bereitstellung abgeschlossen ist. Bei Erfolg wird in der Befehlszeile die Dienst-URL angezeigt.

  2. Rufen Sie den bereitgestellten Container auf. Dazu öffnen Sie in einem Webbrowser die Dienst-URL.

Cloud Run-Standorte

Cloud Run ist regional. Die Infrastruktur, in der die Cloud Run-Dienste ausgeführt werden, befindet sich demnach in einer bestimmten Region. Aufgrund der Verwaltung durch Google sind die Anwendungen in allen Zonen innerhalb dieser Region redundant verfügbar.

Bei der Auswahl der Region, in der Ihre Cloud Run-Dienste ausgeführt werden, ist vorrangig, dass die Anforderungen hinsichtlich Latenz, Verfügbarkeit oder Langlebigkeit erfüllt werden. Sie können im Allgemeinen die Region auswählen, die Ihren Nutzern am nächsten liegt, aber Sie sollten den Standort der anderen Google Cloud-Produkte berücksichtigen, die von Ihrem Cloud Run-Dienst verwendet werden. Die gemeinsame Nutzung von Google Cloud-Produkten an mehreren Standorten kann sich auf die Latenz und die Kosten des Dienstes auswirken.

Cloud Run ist in diesen Regionen verfügbar:

Unterliegt Preisstufe 1

  • asia-east1 (Taiwan)
  • asia-northeast1 (Tokio)
  • asia-northeast2 (Osaka)
  • europe-north1 (Finnland)
  • europe-west1 (Belgien)
  • europe-west4 (Niederlande)
  • us-central1 (Iowa)
  • us-east1 (South Carolina)
  • us-east4 (Northern Virginia)
  • us-west1 (Oregon)

Unterliegt Preisstufe 2

  • asia-southeast1 (Singapur)
  • australia-southeast1 (Sydney)
  • northamerica-northeast1 (Montreal)

Das Feature "benutzerdefinierte Domains zuweisen" von (vollständig verwalteten) Cloud Run-Diensten kann nicht für Dienste in asia-northeast2, australia-southeast1 oder northamerica-northeast1 verwendet werden. Sie können Cloud Load Balancing mit einer serverlosen NEG nutzen, um (vollständig verwalteten) Cloud Run-Diensten in der Region eine benutzerdefinierte Domain zuzuweisen.

Wenn Sie bereits einen Cloud Run-Dienst erstellt haben, können Sie die Region in der Cloud Console im Cloud Run-Dashboard aufrufen.

Das wars! Sie haben eine in einem Container-Image verpackte Anwendung in Cloud Run bereitgestellt. Cloud Run skaliert das Container-Image automatisch horizontal, damit die empfangenen Anfragen bearbeitet werden können, und skaliert es dann wieder herunter, wenn der Bedarf sinkt. Es fallen nur Kosten für die CPU-, Arbeitsspeicher- und Netzwerkressourcen an, die während der Anfrageverarbeitung verbraucht werden.

Clean-up

Testprojekt entfernen

Während für Cloud Run keine Kosten anfallen, wenn der Dienst nicht verwendet wird, wird Ihnen dennoch das Speichern des Container-Images in Container Registry möglicherweise in Rechnung gestellt. Sie können Ihr Image löschen oder Ihr Cloudprojekt löschen, um Kosten zu vermeiden. Durch das Löschen des Cloudprojekts wird die Abrechnung für alle in diesem Projekt verwendeten Ressourcen beendet.

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite "Ressourcen verwalten"

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen .
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

Weitere Informationen

Weitere Informationen dazu, wie Sie einen Container aus Quellcode erstellen und diesen mithilfe von Push in Container Registry übertragen, finden Sie unter: