最近我需要将web套接字添加到我的后端应用程序中,该应用程序目前托管在Google App Engine(GAE(标准环境中。因为web套接字是GAE的灵活环境中才有的功能,所以我一直在尝试重新部署,但收效甚微。
为了对灵活的环境进行更改,我更新了中的app.yaml文件
runtime: nodejs10
env: standard
至
runtime: nodejs
env: flex
以前在标准环境中工作时,现在使用env: flex
,当我运行命令gcloud app deploy --app-yaml=app-staging.yaml --verbosity=debug
时,我得到以下堆栈跟踪:
Do you want to continue (Y/n)? Y
DEBUG: No bucket specified, retrieving default bucket.
DEBUG: Using bucket [gs://staging.finnsalud.appspot.com].
DEBUG: Service [appengineflex.googleapis.com] is already enabled for project [finnsalud]
Beginning deployment of service [finnsalud-staging]...
INFO: Using ignore file at [~/checkouts/twilio/backend/.gcloudignore].
DEBUG: not expecting type '<class 'NoneType'>'
Traceback (most recent call last):
File "/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 982, in Execute
resources = calliope_command.Run(cli=self, args=args)
File "/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 809, in Run
resources = command_instance.Run(args)
File "/google-cloud-sdk/lib/surface/app/deploy.py", line 115, in Run
return deploy_util.RunDeploy(
File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 669, in RunDeploy
deployer.Deploy(
File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 428, in Deploy
source_files = source_files_util.GetSourceFiles(
File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/source_files_util.py", line 184, in GetSourceFiles
return list(it)
File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/util/gcloudignore.py", line 233, in GetIncludedFiles
six.ensure_str(upload_directory), followlinks=True):
File "//google-cloud-sdk/lib/third_party/six/__init__.py", line 884, in ensure_str
raise TypeError("not expecting type '%s'" % type(s))
TypeError: not expecting type '<class 'NoneType'>'
ERROR: gcloud crashed (TypeError): not expecting type '<class 'NoneType'>'
在这个堆栈跟踪中,它提到了google-cloud-sdk/lib/googlecloudsdk/command_lib/util/gcloudignore.py
中的一个错误,所以我也查看了.gcloudignore文件,但找不到任何错误:
.gcloudignore
.git
.gitignore
node_modules/
为了解决这个错误,我尝试删除我的.gcloudignore文件,这导致了一个不同的错误,但仍然失败了:
Do you want to continue (Y/n)? Y
DEBUG: No bucket specified, retrieving default bucket.
DEBUG: Using bucket [gs://staging.finnsalud.appspot.com].
DEBUG: Service [appengineflex.googleapis.com] is already enabled for project [finnsalud]
Beginning deployment of service [finnsalud-staging]...
DEBUG: expected str, bytes or os.PathLike object, not NoneType
Traceback (most recent call last):
File "/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 982, in Execute
resources = calliope_command.Run(cli=self, args=args)
File "/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 809, in Run
resources = command_instance.Run(args)
File "/google-cloud-sdk/lib/surface/app/deploy.py", line 115, in Run
return deploy_util.RunDeploy(
File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 669, in RunDeploy
deployer.Deploy(
File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 428, in Deploy
source_files = source_files_util.GetSourceFiles(
File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/source_files_util.py", line 184, in GetSourceFiles
return list(it)
File "/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/util.py", line 165, in FileIterator
entries = set(os.listdir(os.path.join(base, current_dir)))
File "/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/posixpath.py", line 76, in join
a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not NoneType
ERROR: gcloud crashed (TypeError): expected str, bytes or os.PathLike object, not NoneType
我想这可能是一个与我的CLI版本有关的错误,我也运行了以下命令来尝试和更新:
gcloud app update
gcloud components update
不幸的是,这对输出没有任何改变。
我注意到,当我在app.yamlenv
值设置为flexible
的情况下运行此命令时,谷歌云上的日志记录部分没有更新,上传到项目存储桶的文件也没有更改。对我来说,这表明在与谷歌云服务进行任何通信之前,CLI中发生了崩溃。如果这是正确的,那么错误的原因似乎不太可能与谷歌云上的错误配置有关,而且一定与我本地机器上的某些东西(软件或配置(有关。
我还尝试在灵活的环境"入门"页面上使用"Hello World"app.yaml配置来排除我自己的应用程序的app.yaml
的配置错误,但这对输出也没有任何更改。
最后,如果在任何时候我将env: flex
更改回env: standard
,那么问题确实消失了。不幸的是,如上所述,这不适用于部署我的web套接字功能。
这让我想到这个错误可能是由于gcloudcli应用程序的错误引起的。然而,如果是这样的话,我希望看到其他人也在使用GAE的灵活环境来报告更多关于这个问题的错误。
无论如何,考虑到这个堆栈跟踪指向gcloud-cli中的代码,我已经用谷歌打开了一个bug票证,可以在这里找到:https://issuetracker.google.com/issues/176839574
我也看到过类似的SO帖子,但这不是我遇到的确切错误,仍然没有解决:gcloud应用程序部署在灵活的环境中失败
如果有人对克服这个问题的其他步骤或方法有任何想法,如果你在这篇帖子上留言,我将不胜感激。谢谢
我在标准环境中使用Node.js的Quickstart部署了一个nodejs应用程序
然后我将app.yaml文件从:
runtime: nodejs10
至
runtime: nodejs
env: flex
一切如预期。
它可能与您的特定用例有关。
令人惊讶的是,这个问题似乎确实与gcloud-cli中的一个错误有关。然而,似乎确实有一个变通办法。
当为部署到flex环境指定了--appyaml
标志时,CLI将崩溃,并显示上面问题中概述的消息。但是,如果您将.yaml文件重命名复制到app.yaml
(默认值(,并在部署时删除此--appyaml
标志,则构建将顺利进行。
如果你也经历过这个错误,请关注谷歌问题,因为我正在与谷歌工程师合作,以确保他们复制并最终修复这个错误。
破碎的app.yaml
runtime:nodejs14
固定app.yaml
runtime: nodejs14
我是认真的。和:
glcoud info --run-diagnostics
是零帮助。
一旦我做到了这一点;错误:gcloud崩溃(TypeError(:应为字符串或字节,如对象"走开了。
我想";冒号+空格";是规范的一部分:为什么YAML规范要求冒号后面有一个空格?