2

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

Google 的文档指出,第一次部署应用程序时会自动生成一个 VM Dockerfile;

如果您使用的是标准运行时,SDK 会在您首次运行 gcloud preview app deploy 命令时为您创建一个 Dockerfile。该文件将存在于预定位置:

  • 如果您使用 Java 进行开发,Dockerfile 将出现在已编译的 Web 应用程序存档目录 (WAR) 的根目录中
  • 如果您使用 Python 或 Go 进行开发,Dockerfile 将出现在应用程序目录的根目录中。

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

您可以在此文件中添加更多 docker 命令,同时继续使用标准运行时声明运行和部署您的应用程序。

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

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

4

2 回答 2

2

我尝试了同样的事情,但没有成功。然而,有一种等效的方法可以做到这一点,我又回到了。

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

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

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

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

重要的提示

开发服务器不支持自定义 Dockerfile(您将收到关于 --custom-entrypoint 的错误),因此如果您这样做,您必须将测试环境移动到 App Engine 服务器。我认为无论您是使用标准运行时并自定义 Dockerfile 还是使用自定义运行时,这都是正确的。看到这个答案

于 2015-12-11T18:13:47.447 回答
0

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

$ 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" 

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

$ 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 实例上运行。

于 2015-12-13T05:20:09.173 回答