构建自定义运行时

自定义运行时可让您使用任何受支持的 App Engine 柔性环境语言的替代实现,或自定义 Google 提供的语言。它还允许您使用能够处理传入 HTTP 请求(示例)的任何其他语言编写代码。 借助自定义运行时,App Engine 柔性环境可以为提供和管理您的扩缩,监控和负载平衡基础架构,让您可以专注于构建应用。

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

提供 app.yaml 文件

您的 app.yaml 配置文件必须至少包含以下设置:

runtime: custom
env: flex

如需了解您可以为应用设置的其他信息,请参阅使用 app.yaml 配置应用

创建 Dockerfile

有关创建 Dockerfile 的全面文档,请访问Docker 网站。如果您使用自定义运行时,则无论提供自己的基础映像,还是要使用 Google 的基础映像之一,都必须提供 Dockerfile。

指定 Google 基本映像

Dockerfile 中的第一个命令通常是用于指定基础映像的 FROM 命令。 下表显示了用于指定任何 Google 提供的基础映像的 FROM 命令,以及用于构建映像的 GitHub 项目:

运行时 命令 备注
转到
GitHub 项目
FROM gcr.io/google-appengine/golang
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 和 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.war 是您根据 target/ (maven) 或 build/staged-app/ (gradle) 目录生成的 WAR 文件的名称。

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

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

命名和定位 Dockerfile

通常,Dockerfile 的名称始终为 Dockerfile,并且与相应的 app.yaml 文件位于同一目录中。但在某些情况下,工具环境可能有不同的要求。例如,基于 Cloud SDK 的 Java 工具(如 Maven、Gradle、Eclipse 和 IntelliJ 插件)要求 Dockerfilesrc/main/docker/Dockerfile 中,并且 app.yaml 文件在 src/main/appengine/app.yaml 中。有关详情,请参阅工具环境的文档

要求的代码结构

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

侦听端口 8080

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

处理生命周期事件

App Engine 柔性环境会定期向您的应用发送某些生命周期事件。

应用关停

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

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

运行状况检查请求

您可以通过定期运行状况检查请求确认虚拟机实例是否已成功部署,并检查正在运行的实例是否保持正常运行状态。

将您的应用与 Google Cloud Platform 集成

在自定义运行时中运行的应用程序可以使用 Google Cloud 客户端库来访问 Google Cloud Platform 服务。 自定义运行时中的应用还可以通过标准 API 使用任何第三方服务。

使用 Google Cloud Platform 服务进行身份验证

一般而言,应用默认凭据提供了最简单的方法来对 Google API 进行身份验证和调用。

有可能使用 Compute Engine Metadata API 直接通过访问令牌验证您的应用,但这要复杂得多。 然后,您可以在 API 请求(例如针对 Cloud Storage 和 Datastore 服务和资源的请求)中使用这些访问令牌。

要详细了解身份验证选项,请点击此处

日志

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

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

您的应用的请求和应用日志由 Cloud 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 容器之外的虚拟机系统日志。