【问题标题】:Google App Engine Python: Error in yaml config file when deployingGoogle App Engine Python:部署时 yaml 配置文件出错
【发布时间】:2019-04-06 15:37:35
【问题描述】:

我正在使用 Google App Engine,Python37 环境。 今天尝试部署微服务时收到错误消息:
我运行命令:

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
...

我的 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 文件不再工作了。

有谁知道最近几天在 Google App Engine 上可能出了什么问题或者可以更改什么?

提前致谢。

【问题讨论】:

  • 该页面声明:“脚本元素唯一可接受的值是 auto。”你有script: main.py
  • 我尝试将其更改为自动,也没有工作。
  • 好像我在第一次尝试时用错字搞砸了。我再次尝试将其更改为script: auto,并且成功了。谢谢snakecharmerb,你回答了我的问题。这是一个测试服务,这样的机会可能会发生。

标签: python python-3.x google-app-engine google-cloud-platform


【解决方案1】:

根据 Python 3.7 的 AppEngine documentation

script 元素唯一可接受的值是 auto

以下是文档中的示例条目:

handlers:
- url: /images
  static_dir: static/images

- url: /.*
  secure: always
  redirect_http_response_code: 301
  script: auto

【讨论】:

  • 感谢奥马尔。 snakecharmedb 也指出了这一点。这是一项 Beta 服务,本周似乎有所改变。我已经修好了。
  • 您是否已经对此进行了测试?默认情况下它是否仍然使用 main.py 我们是否还需要编写 dispach.yaml 和/或 index.yaml?文档对此并不清楚。
【解决方案2】:

@Omair 的较早回答虽然正确,但只是故事的一部分。 OP 的原始问题利用了 App Engine 第一代(“Gen1”)运行时应用程序的 app.yaml 配置文件,其中发生路由,需要 handlers: 中的 script: 指令。虽然对于 Gen1(go111python [2.5]、python27php55)应用程序来说,这是一个完全有效的 app.yaml,但它不适用于下一代 (" Gen2") 应用程序。

注意: Python 2 仅受 App Engine Gen1 支持,而 Python 3 仅受 App Engine Gen2(Standard 或 Flex)支持,因此 if you migrate from Python 2 to 3, you're also porting from Gen1 to Gen2 并需要记住这些差异好吧。 (不幸的是,这意味着从 webapp2 迁移到处理路由的 Web 框架,即 Django、Flask 等)

App 引擎Gen2 requires routing to be done by your framework。因此,所有 Gen1 app.yaml 文件都需要更新。必须将handlers: 用于您的路由,或将其更改为auto(因为它现在由您的Web 框架完成)。如果您有具体的app启动说明,可以提供an entrypoint: directive;查看these examples

handlers:entrypoint: 都是可选的。如果所有脚本处理程序都是auto,则不需要handlers:,除非您的应用程序提供静态文件,如客户端JS、CSS、HTML、图像等,并且entrypoint: 是可选的,因为如果您不这样做' t 指定服务器,默认选择(并启动)gunicorn。基本上,如果您采用所有默认值并且不提供静态文件,则可以将 app.yaml 减少到 1 行,例如 this one。该示例来自我正在开发的一个存储库,旨在帮助开发人员将 Python 2 App Engine 应用程序升级到 Python 3,他们需要的帮助比 official migration guide 提供的帮助更多。

【讨论】:

    【解决方案3】:

    我在部署具有蓝图结构的烧瓶应用程序时遇到此错误。解决方案是将main.py 文件与app.yaml 文件放在同一目录中。在main.py 文件中,导入应用程序对象,例如from app import app(这里的第一个“应用程序”是包含 init 文件的文件夹,其中创建了烧瓶应用程序实例)。完成此操作后,将脚本设置为自动应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 2018-12-11
      • 2015-12-08
      • 2015-02-10
      • 2018-12-16
      • 2019-05-24
      • 2015-05-10
      相关资源
      最近更新 更多