Ruby-Laufzeit

Die Ruby-Laufzeit ist das Softwarepaket, das für die Installation Ihres Anwendungscodes und der Abhängigkeiten sowie für die Ausführung dieser Anwendung in der flexiblen Umgebung verantwortlich ist.

Ruby-Versionen

Ruby 3.3 verwendet Buildpacks. Eine vollständige Liste der unterstützten Ruby-Versionen und der entsprechenden Ubuntu-Versionen finden Sie im Laufzeitsupportzeitplan.

Für die Verwendung einer unterstützten Ruby-Version müssen Sie Folgendes tun:

  • Geben Sie eine Ruby-Version im Gemfile an:

    RUBY VERSION
      ruby 3.3.x
    
  • Installieren Sie die CLI-Version 420.0.0 oder höher. Sie können die Befehlszeilentools mit dem Befehl gcloud components update aktualisieren. Zum Aufrufen der installierten Version können Sie den Befehl gcloud version ausführen.

  • Geben Sie die operating_system-Einstellung in der app.yaml-Datei an:

      runtime: ruby
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    
  • Optional können Sie mit einer .ruby-version-Datei in Ihrem Anwendungsverzeichnis eine Version des Ruby-Interpreters angeben. z. B. 3.3.x.

Vorgängerversionen

Geben Sie für die Ruby-Laufzeit Version 3.1 und früher eine Version des Ruby-Interpreters über eine .ruby-version-Datei in Ihrem Anwendungsverzeichnis an.

Ist diese Datei vorhanden, installiert die Laufzeit beim Bereitstellen der Anwendung mithilfe von rbenv die angeforderte Ruby-Version. Wenn die angeforderte Version nicht installiert werden kann, zeigt App Engine während der Bereitstellung eine Fehlermeldung an.

Wenn Sie keine .ruby-version-Datei angeben, ist die Ruby-Laufzeit standardmäßig Version 2.7. Der Standardwert kann sich jederzeit ändern. Daher sollten Sie in der Anwendung eine Ruby-Version angeben.

Unterstützung für andere Ruby-Laufzeiten

Wenn Sie eine Ruby-Version verwenden müssen, die nicht unterstützt wird, können Sie eine benutzerdefinierte Laufzeit erstellen und ein gültiges Basis-Image mit der von Ihnen benötigten Ruby-Version auswählen.

Informationen zu von Google bereitgestellten Basis-Images oder Docker-Basis-Images für Ruby finden Sie unter Benutzerdefinierte Laufzeiten erstellen.

Abhängigkeiten

Die Laufzeit sucht im Quellverzeichnis der Anwendung nach der Datei Gemfile und verwendet Bundler, um Abhängigkeiten zu installieren, bevor die Anwendung gestartet wird. Weitere Informationen zum Deklarieren und Verwalten von Paketen finden Sie unter Ruby-Bibliotheken verwenden.

C-Bibliotheken mit Ruby verwenden

Für Ruby-Bibliotheken, die C-Erweiterungen benötigen, sind die Header für die aktuelle Ruby-Version und die folgenden Ubuntu-Pakete auf dem System vorinstalliert.

  • autoconf
  • build-essential
  • ca-certificates
  • cmake
  • curl
  • file
  • git
  • imagemagick
  • libcurl3
  • libcurl3-gnutls
  • libcurl4-openssl-dev
  • libffi-dev
  • libgdbm-dev
  • libgit2-dev
  • libgmp-dev
  • libicu-dev
  • libjemalloc-dev
  • libjemalloc1
  • libmagickwand-dev
  • libmysqlclient-dev
  • libncurses5-dev
  • libpq-dev
  • libqdbm-dev
  • libreadline6-dev
  • libsqlite3-dev
  • libssl-dev
  • libxml2-dev
  • libxslt-dev
  • libyaml-dev
  • libz-dev
  • systemtap
  • tzdata

Diese Pakete ermöglichen die Installation der gängigsten Ruby-Bibliotheken. Wenn Ihre Anwendung zusätzliche Abhängigkeiten auf Betriebssystemebene erfordert, verwenden Sie eine auf dieser Laufzeit basierende benutzerdefinierte Laufzeit, um die entsprechenden Pakete zu installieren.

Anwendungsstart

Die Laufzeit startet Ihre Anwendung mit dem in app.yaml definierten entrypoint. Der Einstiegspunkt sollte einen Prozess starten, der auf HTTP-Anfragen an dem von der Umgebungsvariablen PORT definierten Port antwortet. Beispiel:

entrypoint: bundle exec rails server -p $PORT

Die meisten Webanwendungen verwenden einen von Rack unterstützten Webserver wie Puma, Unicorn oder Thin.

Sie müssen den Server als Abhängigkeit in der Konfigurationsdatei Gemfile Ihrer Anwendung hinzufügen. Von der Laufzeit werden alle Abhängigkeiten installiert, bevor der Einstiegspunkt aufgerufen wird.

source "https://rubygems.org"

gem "rack"
gem "puma"

Beispiel für einen Einstiegspunkt unter Verwendung von Puma für eine Rails-Anwendung:

entrypoint: bundle exec rails server Puma -p $PORT

Beispiel für einen Einstiegspunkt unter Verwendung von Puma für eine beliebige Rack-Anwendung:

entrypoint: bundle exec rackup -s Puma -p $PORT

Für Anwendungen, die Anfragen ohne einen Rack-Server verarbeiten können, müssen Sie lediglich ein Ruby-Skript ausführen:

entrypoint: bundle exec ruby app.rb

Umgebungsvariablen

Die folgenden Umgebungsvariablen werden durch die Laufzeitumgebung festgelegt:

Umgebungsvariable Beschreibung
GAE_INSTANCE Der Name der aktuellen Instanz
GAE_MEMORY_MB Die Größe des für den Anwendungsprozess verfügbaren Speichers
GAE_SERVICE Der in der Datei app.yaml Ihrer Anwendung angegebene Dienstname. Wenn kein Dienstname angegeben ist, wird als Wert default festgelegt.
GAE_VERSION Das Versionslabel der aktuellen Anwendung
GOOGLE_CLOUD_PROJECT Die mit Ihrer Anwendung verknüpfte Projekt-ID, die in der Google Cloud Console angezeigt wird
PORT Der Port, der HTTP-Anfragen empfängt
RACK_ENV Legen Sie production fest.
RAILS_ENV Legen Sie production fest.
RAILS_SERVE_STATIC_FILES Legen Sie true fest.

Sie können mit app.yaml noch weitere Umgebungsvariablen festlegen.

Metadatenserver

Jede Instanz Ihrer Anwendung kann den Compute Engine-Metadatenserver verwenden, um Informationen über die Instanz abzufragen, einschließlich ihres Hostnamens, ihrer externen IP-Adresse, Instanz-ID, benutzerdefinierten Metadaten und Dienstkontoinformationen. Sie können in App Engine nicht für jede einzelne Instanz benutzerdefinierte Metadaten festlegen. Sie haben aber die Möglichkeit, projektweite benutzerdefinierte Metadaten festzulegen und diese aus den App Engine- und Compute Engine-Instanzen zu lesen.

Diese Beispielfunktion ruft eine externe IP-Adresse einer Instanz über den Metadatenserver ab:

require "sinatra"
require "net/http"

get "/" do
  uri = URI.parse(
    "http://metadata.google.internal/computeMetadata/v1" +
    "/instance/network-interfaces/0/access-configs/0/external-ip"
  )

  request = Net::HTTP::Get.new uri.path
  request.add_field "Metadata-Flavor", "Google"

  http = Net::HTTP.new uri.host, uri.port

  response = http.request request

  "External IP: #{response.body}"
end