最近,我需要向当前托管在 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.yaml env
值设置为 flexible
的情况下运行此命令时,谷歌云上的日志记录部分没有更新,上传到的文件也没有更改项目的存储桶。对我来说,这表明在与谷歌云服务进行任何通信之前,CLI 中发生了崩溃。如果这是正确的,那么错误的原因似乎不太可能与谷歌云上的错误配置有关,而且必须与我本地机器上的某些东西(软件或配置)有关。
我还尝试在灵活环境“Getting Started”页面上使用“Hello World”app.yaml 配置来排除我自己的应用程序 app.yaml
的配置错误,但这也没有改变输出。
最后,如果我在任何时候将 env: flex
改回 env: standard
,那么问题就会消失。不幸的是,如上所述,这不适用于部署我的网络套接字功能。
这让我想到错误可能是由于 gcloud cli 应用程序的错误造成的。但是,如果是这种情况,我本希望看到其他也在使用 GAE 灵活环境的其他人针对此问题提交的更多错误报告。
无论如何,鉴于此堆栈跟踪指向 gcloud cli 中的代码,我已使用谷歌打开了一个错误票证,可在此处找到:https://issuetracker.google.com/issues/176839574
我也看过这个类似的 SO 帖子,但这不是我遇到的确切错误并且仍未解决:gcloud app deploy fails with flexible environment
如果有人对尝试的其他步骤或解决此问题的方法有任何想法,如果您在此帖子上留言,我将不胜感激。谢谢!
答案 0 :(得分:0)
我使用 Quickstart for Node.js in the standard environment
部署了一个 nodejs 应用程序然后我将 app.yaml 文件从:
runtime: nodejs10
到
runtime: nodejs
env: flex
一切都按预期进行。
这可能与您的特定用例有关。
答案 1 :(得分:0)
令人惊讶的是,这个问题似乎与 gcloud cli 中的错误有关。不过,似乎确实有一种解决方法。
当为部署到 flex 环境指定了 --appyaml
标志时,CLI 会崩溃,并显示我上面问题中概述的消息。但是,如果您将 .yaml 文件重命名为 app.yaml
(默认值)并在部署时删除此 --appyaml
标志,则构建将继续进行而不会出错。
如果您也遇到过此错误,请关注 google issue,因为我正在与 google 工程师合作,以确保他们重现并最终修复此错误。