我想修改一个使用标准运行时(python27)的谷歌应用引擎管理的虚拟机的Dockerfile。
我想添加一个C++库来实现HTTP请求。这个库几乎是我需要添加到沙盒python27运行时中的唯一一个库。
文件清楚地表明这是可能的:
每个标准运行时都使用默认的Dockerfile,该文件由SDK提供。您可以通过向该文件添加新的docker命令来扩展和增强标准运行时。
在其他地方,他们说标准运行时的Dockerfile将在项目目录中生成:
当您使用gcloud基于标准运行时(在本例中为Python27)运行或部署托管VM应用程序时,SDK将使用标准运行时作为基本映像创建一个最小的Dockerfile。你会在你的项目目录中找到这个Dockerfile。。。
这是我应该根据同一页面修改的:
本教程后面的步骤将向您展示如何通过向Dockerfile添加指令来扩展运行时环境的功能。
问题是,当我在开发服务器上运行我的应用程序时,我在任何地方都找不到Dockerfile,所以我无法对它进行任何更改
有人修改过谷歌应用引擎的标准运行时Dockerfile吗?如有任何帮助,我们将不胜感激。
要使用google api python客户端,我也遇到了同样的问题,因为我需要pycrypto。我总是得到错误:
CryptoUnavailable错误:没有可用的加密库
为了解决这个问题,我创建了一个实例启动处理程序,用于安装所有需要的库。它很难看,但很管用。
app.yaml:
handlers:
- url: /_ah/start
script: start_handler.app
start_handler.py
import webapp2
import logging
import os
class StartHandler(webapp2.RequestHandler):
def execute(self, cmd):
logging.info(os.popen("%s 2>&1" % cmd).read())
def get(self):
if not os.environ.get('SERVER_SOFTWARE','').startswith('Development'):
self.execute("apt-get update")
self.execute("apt-get -y install build-essential libssl-dev libffi-dev python-dev")
self.execute("pip install cryptography")
self.execute("pip install pyopenssl")
app = webapp2.WSGIApplication([
('/_ah/start', StartHandler)
], debug=True)
Dockerfile似乎只是在使用gcloud preview app run
时生成的,而不是我使用的dev_appserver.py
。
然而,我无法修改Dockerfile并运行自定义托管虚拟机。但这是一个单独的错误(与--custom_entrypoint
相关)。
糟糕的文件和支持助长了整个局势的噩梦。这是对其他考虑谷歌应用引擎的开发者的警告。
事实证明,在应用程序中扩展Dockerfile并不像文档(链接)中所说的那样工作。事实上,如果存在Dockerfile,您将得到以下错误:
"ERROR: (gcloud.preview.app.deploy) There is a Dockerfile in the current directory, and the runtime field in /[...]/app.yaml is currently set to [runtime: python27]. To use your Dockerfile to build a custom runtime, set the runtime field in [...]/app.yaml to [runtime: custom]. To continue using the [python27] runtime, please omit the Dockerfile from this directory"
我能够使用自定义Dockerfile的唯一方法是使用自定义运行时。
Google有一个非常好的GitHub示例,可以使用自定义Python运行时将Django部署到托管虚拟机(此处)。
由于您使用的是自定义运行时,您必须自己实现健康检查。然而,如果你需要访问谷歌API,谷歌有一个如何在GitHub上设置的例子(这里)。
有关实现健康检查或与Google API集成的帮助,您可以遵循Google计算引擎入门系列教程(此处)。