问题描述
我正在尝试为 Google App Engine 创建一个自定义托管 VM,其行为与 Google 提供的标准 python27 托管 VM 相同。(我这样做是向运行时添加 C++ 库的第一步)。
从 google文档中,以下 Dockerfile 指定了标准的 python27 运行时:
FROM gcr.io/google_appengine/python-compat
ADD . /app
gcloud preview app run
通过检查使用标准 python27 运行时生成的文件,我已经验证了这是正确的 Dockerfile 。它与此相同。
但是当我使用这个 Dockerfile 运行我的应用程序时dev_appserver.py
,gcloud preview app run
我收到一条错误消息:
The --custom_entrypoint flag must be set for custom runtimes
我正在使用最新版本的 gcloud(1.9.86,带有 app-engine-python 组件版本 1.9.28)和独立的 python 应用引擎 SDK(1.9.28)。我之前的版本也有同样的问题,所以我更新到最新版本。
我尝试过的事情:
gcloud preview app run --help
有以下要说的--custom-entrypoint
:
--custom-entrypoint CUSTOM_ENTRYPOINT
Specify an entrypoint for custom runtime modules. This is required when
such modules are present. Include "{port}" in the string (without
quotes) to pass the port number in as an argument. For instance:
--custom_entrypoint="gunicorn -b localhost:{port} mymodule:application"
我不知道该怎么做。docker 映像是否应该尚未包含 ENTRYPOINT?为什么我需要另外提供一份?另外,图像的入口点应该gcr.io/google_appengine/python-compat
是什么?谷歌没有为此提供任何文档。
我尝试了一个无意义的--custom-entrypoint="echo"
,它使错误静音,但应用程序不响应任何 HTTP 请求。
我发现的另外两个相关的 stackoverflow 问题没有帮助。接受的答案似乎表明这是已解决的 SDK 中的错误。但是我在两个版本的SDK中都试过了,包括最新的,还是有问题。
重现步骤:
为了突出我的问题,我创建了一个生成错误的简单应用程序。它仅包含三个文件:
app.yaml
:
module: default
version: 1
runtime: custom
api_version: 1
threadsafe: true
vm: true
handlers:
- url: /.*
script: wsgi.app
Dockerfile
:
FROM gcr.io/google_appengine/python-compat
ADD . /app
这Dockerfile
与用于 python27 运行时的相同(实际上是从使用 python27gcloud preview app run
运行时生成的 Dockerfile 复制粘贴的),因此这应该与设置相同runtime: python27
。
wsgi.py
:
import webapp2
class Hello(webapp2.RequestHandler):
def get(self):
self.response.write(u'Hello')
app = webapp2.WSGIApplication([('/Hello', Hello)], debug=True)
但是,当我dev_appserver.py app.yaml
在包含这三个文件的目录中运行时,出现以下错误:
Traceback (most recent call last):
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 83, in <module>
_run_file(__file__, globals())
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 79, in _run_file
execfile(_PATHS.script_file(script_name), globals_)
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 1033, in <module>
main()
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 1026, in main
dev_server.start(options)
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 818, in start
self._dispatcher.start(options.api_host, apis.port, request_data)
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/dispatcher.py", line 194, in start
_module.start()
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 1555, in start
self._add_instance()
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 1707, in _add_instance
expect_ready_request=True)
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/custom_runtime.py", line 73, in new_instance
assert self._runtime_config_getter().custom_config.custom_entrypoint
File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 383, in _get_runtime_config
raise ValueError('The --custom_entrypoint flag must be set for '
ValueError: The --custom_entrypoint flag must be set for custom runtimes