我使用的是谷歌应用引擎,Python 37环境。我今天在尝试部署微服务时收到一条错误消息:
我运行命令:
gcloud app deploy app.yaml
得到错误:
...
File upload done.
ERROR: (gcloud.app.deploy) INVALID_ARGUMENT: script field for handler '/.*'
must be set to 'auto' for runtime python37.
PS C:path_to_app> gcloud app deploy app.yaml
...
我的应用程序是:
service: service_name
runtime: python37
handlers:
- url: /.*
script: main.py
它与我最近部署的其他微服务看起来完全相同,只是服务名称不同
我试图重新部署一个已经在运行的服务,但收到了相同的错误消息
所以我仔细检查app.yaml参考文件:https://cloud.google.com/appengine/docs/standard/python3/config/appref
但我找不出问题所在,也找不出为什么以前有效的yaml文件不再有效
有人知道最近几天谷歌应用程序引擎上可能出现的错误或可能发生的变化吗
提前感谢。
根据Python 3.7的AppEngine文档,
脚本元素唯一可接受的值是自动
以下是文档中的一个示例条目:
handlers:
- url: /images
static_dir: static/images
- url: /.*
secure: always
redirect_http_response_code: 301
script: auto
@Omair的早期答案虽然正确,但只是故事的一部分。OP最初的问题利用了应用引擎第一代("Gen1"(运行时应用程序的app.yaml
配置文件进行路由,需要handlers:
中的script:
指令。虽然这对于第1代(go111
、python
[2.5]、python27
、php55
(应用程序来说是一个完全有效的app.yaml
,但它对下一代("第2代"(应用程序不起作用。
注意:Python 2仅由应用引擎Gen1支持,而Python 3仅由应用程序引擎Gen2(Standard或Flex(支持,因此,如果您从Python 2迁移到3,您也将从Gen1迁移到Gen2,并且需要记住这些差异。(不幸的是,这意味着从
webapp2
迁移到处理路由的web框架,即Django、Flask等(
AppEngineGen2要求路由由您的框架完成。因此,所有Gen1app.yaml
文件都需要更新。路由使用handlers:
必须删除或更改为auto
(因为现在是由web框架完成的(。如果您有特定的应用程序启动指令,可以提供entrypoint:
指令;看看这些例子。
handlers:
和entrypoint:
都是可选的。如果所有脚本处理程序都是auto
,则不需要handlers:
,除非您的应用程序提供客户端JS、CSS、HTML、图像等静态文件,并且entrypoint:
是可选的,因为如果您没有指定服务器,则默认情况下会选择(并启动(gunicorn
。基本上,如果您采用所有默认值,并且不提供静态文件,您可以将app.yaml
减少到1行,就像这一行一样。该示例来自我正在开发的一个repo,该repo旨在帮助开发人员将Python 2应用程序引擎应用程序升级到Python 3,他们需要比官方迁移指南中更多的帮助。
我在部署具有蓝图结构的flask应用程序时遇到了这个错误。解决方案是将main.py
文件与app.yaml
文件放在同一目录中。在main.py
文件中,导入应用程序对象,例如from app import app
(这里的第一个"应用程序"是包含init文件的文件夹,创建flask应用程序实例(。完成此操作后,将脚本设置为自动应该可以正常工作。