如何使用标准运行时自定义 Google App Engine 托管 VM?

How do I customise a Google App Engine Managed VM with a Standard Runtime?

我想自定义一个 (Python) 标准运行时托管 VM。 从理论上讲,这应该可以通过向 VM Dockerfile 添加一些额外的命令来实现。

Google's documentation表示首次部署App时会自动生成VM Dockerfile;

If you are using a standard runtime, the SDK will create a Dockerfile for you the first time you run the gcloud preview app deploy commands. The file will exist in a predetermined location:

  • If you are developing in Java, the Dockerfile appears in the root of the compiled Web Application Archive directory (WAR)
  • If you are developing in Python or Go, the Dockerfile appears in the root of your application directory.

而且确实可以添加额外的命令;

You can add more docker commands to this file, while continuing to run and deploy your app with the standard runtime declaration.

然而实际上,Dockerfile 会在部署完成后立即自动删除,从而阻止任何自定义。

有没有人设法将 Dockerfile 命令添加到具有标准运行时的托管 VM?如有任何帮助,我们将不胜感激。

我试过同样的事情,但没有成功。然而,我又回到了一种等效的方法。

您可以创建模仿标准运行时的自定义运行时。

您可以这样做,因为 Google 为所有标准运行时提供了 Docker base images。因此,模仿标准运行时只需在自定义运行时的 Docker 文件中选择正确的基础映像即可。对于标准 Python App Engine VM,Docker 文件是:

FROM gcr.io/google_appengine/python-compat
ADD . /app

现在您已将标准运行时重新创建为自定义运行时,您可以修改 Docker 文件以进行所需的任何自定义。

重要提示

开发服务器不支持自定义 Docker 文件(您会收到有关 --custom-entrypoint 的错误消息),因此如果您这样做,您必须将测试环境移至 App Engine 服务器。我认为无论您是使用标准运行时并自定义 Docker 文件还是使用自定义运行时,都是如此。参见

有关开发服务器无法使用自定义 运行 次的说明 - dev_appserver.py 不处理 Docker 或 Docker 文件,这就是它抱怨的原因关于需要您指定 --custom_entrypoint。但是,作为一种解决方法,您可以在本地手动设置依赖项。这是一个使用“appengine-vm-fortunespeak”的示例,它使用基于 python-compat:

的自定义 运行time
$ git clone https://github.com/GoogleCloudPlatform/appengine-vm-fortunespeak-python.git 
$ cd appengine-vm-fortunespeak-python 

# Local dependencies from Dockerfile must be installed manually 
$ sudo pip install -r requirements.txt 
$ sudo apt-get update && install -y fortunes libespeak-dev 

# We also need gunicorn since its used by python-compat to serve the app 
$ sudo apt-get install gunicorn 

# This is straight from dev_appserver.py --help 
$ dev_appserver.py app.yaml --custom_entrypoint="gunicorn -b localhost:{port} main:app" 

请注意,如果您使用任何非 -compat 图像,您可以 运行 您的应用直接使用 Docker,因为它们不兼容需要模拟旧版 App Engine API,例如使用“getting-started-python”,它使用 python 运行time:

$ git clone https://github.com/GoogleCloudPlatform/getting-started-python.git 
$ cd 6-pubsub 

# (Configure the app according to the tutorial ...)

$ docker build . 
$ docker images # (note the IMAGE_ID) 
$ docker run -p 127.0.0.1:8080:8080 -t IMAGE_ID

用任何 -compat 图像尝试上面的方法,你会遇到问题 - 例如 python-compat 你将在 runtime/google/appengine/tools/vmboot.py 中看到初始化错误。它需要在真实的托管 VM 实例上 运行。