无法运行Google App Engine自定义托管的虚拟机:--custom-entrypoint必须设置为错误
问题描述
我正在尝试为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 。与此相同。
但是,当我使用dev_appserver.py
或对此Dockerfile运行应用程序时,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
app引擎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"
我不确定该怎么做。码头工人映像是否应该尚未包含ENTRYPOINT?为什么要求我另外提供一个?另外,gcr.io/google_appengine/python-
compat
图像的入口点应该是什么?Google没有为此提供任何文档。
我尝试了一个无意义的方法--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
与python27gcloud preview app
run
运行时使用的相同(实际上是从字面上从使用python27运行时生成的Dockerfile复制粘贴),因此这应该与setting相同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
-
更新
这可能不再准确。请参阅尼克的答案。
(尽管我无法正常工作。但是我并没有很努力地尝试)
自定义托管的VM有一个完全未记录但绝对必要的信息:
它们无法在开发服务器上运行!
如果您认为这个至关重要的事实会在所有理智的地方提及,例如自定义托管VM的文档页面,或者
dev_appserver.py
运行时的错误消息,甚至在运行时出现错误消息dev_appserver.py
,那么您就应该对Google给予过多的赞誉。在github上的appengine-java-vm-guestbook-
extras演示的自述文件中,我可以找到有关此声明的唯一方法(严重):提供Dockerfile时,Cloud SDK不支持运行自定义运行时。您必须将应用程序部署到App Engine
Google不在乎:
- 实施此基本和重要功能。
- 记录开发服务器缺少如此重要的功能。
- 当用户不愿意执行该操作时,请给出任何合理的错误消息。
我希望这个答案可以避免我因此而遭受的痛苦折磨。