构建自定义运行时

借助自定义运行时,您可以轻松部署和运行用任意语言编写的网络应用。App Engine 柔性环境提供具备扩缩、监控和负载平衡能力的基础架构,因此您可以专注于构建自己的应用。

要创建自定义运行时,您需要:

  • 一个描述应用的运行时配置的 app.yaml 文件。
  • 用于配置运行时环境的 Dockerfile。在许多情况下,这可以只是指定了基础映像的一行内容。
  • 确保您的应用在侦听端口 8080,并具有用于响应生命周期事件(例如启动、停止和运行状况检查请求)的请求处理程序。

创建 app.yaml 文件

您必须使用具有以下设置的 app.yaml 配置文件:

runtime: custom
env: flex

如需了解如何为应用配置其他柔性环境设置,请参阅使用 app.yaml 配置应用

创建 Dockerfile

Dockerfile 的名称始终为 Dockerfile,它应与对应的 app.yaml 文件放在同一目录中。如果您要自定义 Java 运行时以及使用 gcloud 命令,也应该这样操作;不过,其他工具可能有不同的要求。例如,基于 Cloud SDK 的 Java 工具(如 Maven、Gradle、Eclipse 和 IntelliJ 插件)要求 Dockerfile 位于 src/main/docker/Dockerfile 目录中,app.yaml 文件位于 src/main/appengine/app.yaml 目录中。

Docker 网站上提供了全面的文档。无论您使用自己的基础映像,还是使用 Google 的某个基础映像,都需要按照相应要求操作。为简单起见,本页面展示了如何使用 Google 提供的基础映像的示例。

配置 Dockerfile

Dockerfile 中的第一个命令通常是用于指定基础映像的 FROM 命令。

下表显示了 Google 提供的每个基础映像的 FROM 命令,以及用于构建映像的 github 项目:

运行时 命令 备注
Go
github 项目
FROM gcr.io/google-appengine/golang API 需要 Go 库
Java(仅限 Open JDK 8)
github 项目
FROM gcr.io/google-appengine/openjdk Java 版 Dockerfile
Java (Open JDK 8 + Eclipse Jetty 9.3)
github 项目
FROM gcr.io/google-appengine/jetty Java 版 Dockerfile
Python 2.7 和 Python 3.6
github 项目
FROM gcr.io/google-appengine/python
Node.js
github 项目
FROM gcr.io/google-appengine/nodejs
Ruby
github 项目
FROM gcr.io/google-appengine/ruby
PHP
github 项目
FROM gcr.io/google-appengine/php

使用 App Engine 服务 API

要从运行 golang 基础映像的 Go 应用访问 App Engine 服务 API,您必须将 App Engine Go 库导入到源代码中。

使用自定义 Java 运行时

要自定义 Java 运行时并添加更多指令,您必须创建一个 Dockerfile。

Java 8/Jetty 9 版 Dockerfile 示例:

FROM gcr.io/google-appengine/jetty
ADD test-webapp-1.0-SNAPSHOT.war $JETTY_BASE/webapps/root.war
WORKDIR $JETTY_BASE
RUN java -jar $JETTY_HOME/start.jar --approve-all-licenses --add-to-startd=jmx,stats,hawtio \
 && chown -R jetty:jetty $JETTY_BASE

其中,test-webapp-1.0-SNAPSHOT.wartarget/ (maven) 或 build/staged-app/ (gradle) 目录中的已编译 WAR 文件的名称。

相比之下,如果您选择使用 Google 提供的 Java 运行时的非自定义基础映像,则无需借助 Dockerfile 将应用部署到 App Engine。如需了解详情,请参阅 Java 8 运行时Java 8/Jetty 9 运行时

如需获取 Google 提供的所有映像的完整列表,请参阅 google-appengine 项目

开发适用于自定义运行时的代码

本部分介绍使用 Google 提供的基础映像或自己的基础映像时您的代码都必须实现的行为。

侦听端口 8080

App Engine 前端会将传入请求路由到端口 8080 上的相应模块。您必须确保应用代码在侦听端口 8080。

生命周期事件

应用关停

关停实例时,App Engine 柔性环境通常会向应用容器发送“STOP”(SIGTERM) 信号。您的应用无需响应此事件,但可以在容器关停之前使用该事件来执行所有必要的清理操作。在正常情况下,系统会等待最多 30 秒以使应用停止运行,然后发送“KILL”(SIGKILL) 信号。

在极少数情况下,如果发生中断,可能会造成 App Engine 无法提供 30 秒的关停时间,这意味着在实例终止之前可能不会发送“STOP”和“KILL”信号。为降低这种可能性,您应该定期给实例的状态设置检查点,主要将其用作内存中的缓存,而不是可靠的数据存储区。

运行状况检查请求

默认情况下,系统会向在柔性环境中运行的应用定期发送运行状况检查请求

如果您创建自定义运行时,则您的应用必须处理运行状况检查请求或停用这些请求,否则,应用将无法正常运行。

运行状况检查是向网址 /_ah/health 发出的 HTTP 请求。如果应用的运行状况良好,则应使用状态代码 200 进行响应。

简而言之,应用可以检查其传送堆栈是否已启动并运行;它还可以执行更复杂的检查,例如确保所有后台进程正在运行。

要停用运行状况检查,请将如下行添加到应用的配置文件中:

enable_health_check: False

使用 Google Cloud Platform 服务

在柔性环境中运行的应用可以通过标准 API 访问 Google Cloud 客户端库或任何第三方服务。

API 客户端

借助自定义运行时,客户端库可以使用应用默认凭据进行 Google API 身份验证以及调用 Google API。

或者,您可以使用 Compute Engine Metadata API 直接通过访问令牌对您的应用进行身份验证。然后,您可以在 API 请求(例如针对 Cloud Storage 以及 Cloud Datastore 服务和资源的请求)中使用这些访问令牌。

日志记录

在请求发送到 App Engine 中运行的应用后,系统会自动记录请求和响应详细信息,您可以在 Google Cloud Platform Console Stackdriver 日志查看器中查看这些详细信息。

应用在处理请求时,还可以将自己的日志记录消息写入 stdoutstderr。系统会自动收集这些文件,您可以在日志查看器中查看它们。系统仅会保留 stdoutstderr 的最新条目,以便对其大小进行限制。

应用的请求和应用日志由 Stackdriver Logging 代理收集,并最多保留 90 天,日志大小不能超过 1GB。如果您要将日志存储更长时间,或存储大小超过 1GB 的日志,则可以导出日志到 Cloud Storage。您还可以将日志导出到 BigQuery 和 Pub/Sub,以供进一步处理。

其他日志也可供您使用。以下是默认配置的一些日志:

日志名称 负载类型 用途
crash.log text 安装失败时记录的信息。如果您的应用无法运行,请检查此日志。
monitoring.* text Docker 容器将数据发布到 Cloud Monitoring 时的信息。
shutdown.log text 关停时记录的信息。
stdout text 应用的标准输出。
stderr text 容器的标准错误。
syslog text 位于 Docker 容器之外的虚拟机系统日志。