Ruby 运行时

Ruby 运行时是负责安装应用代码和依赖项,然后在柔性环境中运行该应用的软件栈。

Ruby 版本

Ruby 3.3 使用 buildpacks。如需查看受支持的 Ruby 版本及其对应 Ubuntu 版本的完整列表,请参阅运行时支持时间表

如需使用受支持的 Ruby 版本,您必须:

  • Gemfile 中指定 Ruby 版本。

    RUBY VERSION
      ruby 3.3.x
    
  • 安装 gcloud CLI 420.0.0 或更高版本。您可以通过运行 gcloud components update 命令来更新 CLI 工具。如需查看已安装的版本,您可以运行 gcloud version 命令。

  • app.yaml 文件中指定 operating_system 设置:

      runtime: ruby
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    
  • (可选)您可以使用应用目录中的 .ruby-version 文件指定 Ruby 解释器版本。例如 3.3.x

先前版本

如需使用 Ruby 3.1 及更低版本的运行时,请使用应用目录中的 .ruby-version 文件指定 Ruby 解释器版本。

如果此文件存在,运行时将在您部署应用时使用 rbenv 来安装所指定的 Ruby 版本。如果无法安装所指定的版本,App Engine 会在部署期间显示错误消息。

如果您未提供 .ruby-version 文件,则 Ruby 运行时默认为 2.7 版。请注意,默认版本可能随时更改,因此建议您的应用指定 Ruby 版本。

对其他 Ruby 运行时的支持

如果您需要使用不受支持的 Ruby 版本,可以创建自定义运行时,并选择带有所需 Ruby 版本的有效基础映像。

对于 Google 提供的基础映像或 Docker Ruby 基础映像,请参阅构建自定义运行时

依赖项

在启动应用之前,运行时会在应用的源代码目录中查找 Gemfile 文件,并使用 Bundler 安装所有依赖项。如需详细了解如何声明和管理软件包,请参阅使用 Ruby 库

将 C 语言库与 Ruby 结合使用

对于需要 C 扩展程序的 Ruby 库,系统中预先安装了当前 Ruby 版本的头文件和以下 Ubuntu 软件包

  • 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

这些软件包支持安装最热门的 Ruby 库。如果您的应用需要其他操作系统级依赖项,您将需要使用基于此运行时的自定义运行时来安装相应的软件包。

应用启动

运行时使用 app.yaml 文件中定义的 entrypoint 来启动应用。entrypoint 应启动一个进程,以响应环境变量 PORT 所定义端口上的 HTTP 请求。例如:

entrypoint: bundle exec rails server -p $PORT

大多数 Web 应用都使用支持 Rack 的 Web 服务器,如 PumaUnicornThin

您必须将服务器作为依赖项添加到应用的 Gemfile 配置文件中。运行时将会在 entrypoint 调用之前安装所有依赖项。

source "https://rubygems.org"

gem "rack"
gem "puma"

在 Rails 应用中使用 puma 时对应的 entrypoint 示例:

entrypoint: bundle exec rails server Puma -p $PORT

在任意 Rack 应用中使用 puma 时对应的 entrypoint 示例:

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

对于可在没有 Rack 服务器的情况下处理请求的应用,您只需执行 ruby 脚本:

entrypoint: bundle exec ruby app.rb

环境变量

以下环境变量由运行时环境设置:

环境变量 说明
GAE_INSTANCE 当前实例的名称。
GAE_MEMORY_MB 可供应用进程使用的内存量。
GAE_SERVICE 在应用的 app.yaml 文件中指定的服务名称,如果未指定服务名称,则设置为 default
GAE_VERSION 当前应用的版本标签。
GOOGLE_CLOUD_PROJECT 与您的应用关联的项目 ID,可在 Google Cloud 控制台中查看
PORT 将接收 HTTP 请求的端口。
RACK_ENV 设置为 production
RAILS_ENV 设置为 production
RAILS_SERVE_STATIC_FILES 设置为 true

您可以使用 app.yaml 设置其他环境变量。

元数据服务器

应用的每个实例都可以使用 Compute Engine 元数据服务器来查询实例的相关信息,包括实例的主机名、外部 IP 地址、实例 ID、自定义元数据和服务账号信息。App Engine 不支持为每个实例设置自定义元数据,但您可以设置项目范围的自定义元数据,并从 App Engine 和 Compute Engine 实例中读取这些元数据。

此示例函数使用元数据服务器获取实例的外部 IP 地址。

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