【问题标题】:How do I customise a Google App Engine Managed VM with a Standard Runtime?如何自定义具有标准运行时的 Google App Engine 托管 VM?
【发布时间】:2016-03-17 17:00:37
【问题描述】:

我想定制一个 (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 命令添加到具有标准运行时的托管 VM?任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    重要提示

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

    【讨论】:

      【解决方案2】:

      关于开发服务器不使用自定义运行时的说明 - 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 上,您会在 runtime/google/appengine/ 中看到初始化错误工具/vmboot.py。它需要在真正的托管虚拟机实例上运行。

      【讨论】:

      • 你能让文档团队写一些关于在 dev_appserver.py 上运行自定义运行时的内容吗?就目前而言,完全没有关于它的文档。甚至没有一句说它不能完成,或者需要某种额外的设置。这是一个严重的遗漏。花了 2 天的时间,我才发现它甚至不被支持。
      • 另外,你能详细说明一下兼容图像和非兼容图像吗?当您说旧版 App Engine API 时,您指的是 App Engine API 的哪个方面?如何使用非旧版的标准运行时?
      • 是的,正在调查中。遗留 API 是指支持与标准运行时相同的 App Engine 服务 API 的图像,以“-compat”结尾,列于 cloud.google.com/appengine/docs/managed-vms/…。该文档也应该更新,因为它缺少“非标准”图像 gcr.io/google_appengine/python、gcr.io/google_appengine/golang 和 gcr.io/google_appengine/nodejs(请参阅 docker search gcr.io/google_appengine获取完整的更新列表)。
      猜你喜欢
      • 2016-02-15
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多