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

时间:2015-12-11 17:37:05

标签: google-app-engine google-app-engine-python google-managed-vm

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

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

  

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

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

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

  

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

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

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

2 个答案:

答案 0 :(得分:2)

我尝试了同样的事情并没有成功。然而,有一种相同的做法,我回到了。

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

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

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

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

重要提示

开发服务器不支持自定义Dockerfiles(您将收到有关--custom-entrypoint的错误),因此如果您这样做,则必须将测试环境移至App Engine服务器。无论您是使用标准运行时还是自定义Dockerfile或使用自定义运行时,我认为都是如此。请参阅this answer

答案 1 :(得分: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" 

请注意,如果您使用任何非 -compat 图像,则可以使用Docker直接运行您的应用,因为它们不需要模拟旧版App Engine API,例如使用' getting-started-python'使用 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 上你会看到运行时/ google / appengine /中的初始化错误工具/ vmboot.py。它需要在真实的托管VM实例上运行。