【问题标题】:gcloud dev_appserver.py error while starting Dart Managed VM启动 Dart Managed VM 时出现 gcloud dev_appserver.py 错误
【发布时间】:2015-12-11 12:36:45
【问题描述】:

我为 AppEngine 配置了 Dart 托管 VM,如 tutorial 中所述。它已经过时并且仍然使用现在删除的gcloud preview app run 而不是dev_appserver.py。但是,我发现其他人成功地将 dev_appserver.py 用于 Dart VM,但出现以下错误:

$ dev_appserver.py app.yaml --runtime custom
INFO     2015-12-11 12:19:50,907 application_configuration.py:431] No version specified. Generated version id: 20151211t121950
INFO     2015-12-11 12:19:50,908 devappserver2.py:769] Skipping SDK update check.
INFO     2015-12-11 12:19:50,939 api_server.py:205] Starting API server at: http://localhost:36858
INFO     2015-12-11 12:19:50,951 api_server.py:648] Applying all pending transactions and saving the datastore
INFO     2015-12-11 12:19:50,951 api_server.py:651] Saving search indexes
Traceback (most recent call last):
  File "/opt/google/cloud-sdk/platform/google_appengine/dev_appserver.py", line 83, in <module>
    _run_file(__file__, globals())
  File "/opt/google/cloud-sdk/platform/google_appengine/dev_appserver.py", line 79, in _run_file
    execfile(_PATHS.script_file(script_name), globals_)
  File "/opt/google/cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 1040, in <module>
    main()
  File "/opt/google/cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 1033, in main
    dev_server.start(options)
  File "/opt/google/cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 824, in start
    self._dispatcher.start(options.api_host, apis.port, request_data)
  File "/opt/google/cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/dispatcher.py", line 194, in start
    _module.start()
  File "/opt/google/cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 1548, in start
    self._add_instance()
  File "/opt/google/cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 1700, in _add_instance
    expect_ready_request=True)
  File "/opt/google/cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/custom_runtime.py", line 83, in new_instance
    assert self._runtime_config_getter().custom_config.custom_entrypoint
AssertionError

我的 Dockerfile 已就位且 app.yaml 正确。我在 IntelliJ 中创建了一个示例 Dart AppEngine 项目,并使用教程检查了创建文件的内容。

This post from the e-mail list 建议使用--custom_entrypoint 选项。我试过了,但收到了这个错误信息。似乎在调用 Dart 入口点之前,应用服务器正在声明该端口。

$ dev_appserver.py app.yaml --custom_entrypoint "dart bin/server.dart --port=8080"
INFO     2015-12-11 12:41:13,334 application_configuration.py:431] No version specified. Generated version id: 20151211t124113
INFO     2015-12-11 12:41:13,334 devappserver2.py:769] Skipping SDK update check.
INFO     2015-12-11 12:41:13,363 api_server.py:205] Starting API server at: http://localhost:44617
INFO     2015-12-11 12:41:13,375 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO     2015-12-11 12:41:13,376 admin_server.py:116] Starting admin server at: http://localhost:8000
Unhandled exception:
SocketException: Failed to create server socket (OS Error: Address already in use, errno = 98), address = 0.0.0.0, port = 8080
#0      _NativeSocket.bind.<anonymous closure> (dart:io-patch/socket_patch.dart:494)
#1      _rootRunUnary (dart:async/zone.dart:914)
#2      _CustomZone.runUnary (dart:async/zone.dart:810)
#3      _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:502)
#4      _Future._propagateToListeners (dart:async/future_impl.dart:585)
#5      _Future._completeWithValue (dart:async/future_impl.dart:376)
#6      _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:430)
#7      _rootRun (dart:async/zone.dart:907)
#8      _CustomZone.run (dart:async/zone.dart:802)
#9      _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:735)
#10     _microtaskLoop (dart:async/schedule_microtask.dart:43)
#11     _microtaskLoopEntry (dart:async/schedule_microtask.dart:52)
#12     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:96)
#13     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:151)
^CTraceback (most recent call last):
  File "/opt/google/cloud-sdk/bin/dev_appserver.py", line 35, in <module>
    main()
  File "/opt/google/cloud-sdk/bin/dev_appserver.py", line 29, in main
    os.path.join('platform', 'google_appengine'), 'dev_appserver.py', *args)
  File "/opt/google/cloud-sdk/bin/bootstrapping/bootstrapping.py", line 45, in ExecutePythonTool
    execution_utils.ArgsForPythonTool(_FullPath(tool_dir, exec_name), *args))
  File "/opt/google/cloud-sdk/bin/bootstrapping/bootstrapping.py", line 86, in _ExecuteTool
    execution_utils.Exec(args + sys.argv[1:], env=_GetToolEnv())
  File "/opt/google/cloud-sdk/lib/googlecloudsdk/core/execution_utils.py", line 209, in Exec
INFO     2015-12-11 12:41:37,298 shutdown.py:45] Shutting down.
    ret_val = p.wait()
  File "/usr/lib64/python2.7/subprocess.py", line 1384, in wait
INFO     2015-12-11 12:41:37,298 api_server.py:648] Applying all pending transactions and saving the datastore
    pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
  File "/usr/lib64/python2.7/subprocess.py", line 476, in _eintr_retry_call
    return func(*args)
KeyboardInterruptINFO     2015-12-11 12:41:37,298 api_server.py:651] Saving search indexes

【问题讨论】:

  • 您的 app.yaml 看起来如何?您是否通过了 custom_runtime 标志? groups.google.com/a/dartlang.org/forum/#!msg/cloud/J6LsrVVdJ6o/…
  • 我现在没有 app.yaml,但它是默认的 runtime: custom, vm: true, api_version: 1。我也尝试了 --custom_entrypoint 选项,但失败了,因为 dev_appserver 已经声明了端口 8080(带有默认模块的东西),因此 Dart 无法使用它。我会尽快添加错误日志,我现在在另一台机器上。
  • @GünterZöchbauer 我为您建议的方法添加了错误消息。
  • 我自己已经有一段时间没有使用它了。也许其他人有一个想法。
  • 您能否运行sudo netstat -plant 来确定8080 上是否正在运行其他任何东西?

标签: google-app-engine dart gcloud


【解决方案1】:

本教程已过时,您不能再这样做了。

原因是您使用的是自定义运行时(教程中的app.yamlruntime: custom)。

无法再在开发服务器上运行自定义运行时!!!(请参阅this answer

可以运行应用程序,但您必须部署到 App Engine 服务器。

【讨论】:

  • 这是不正确的,a correct answer 刚刚发布到您链接的问答中。一般来说,相信 README 中的一次性评论而不是 official docs 是不正确的。
  • 如果官方文档对如何运行自定义运行时 dev_appengine.py 进行了说明(任何事情,任何事情),将会很有帮助。此外 --runtime 标志似乎是新的。我在 1.9.28 中找不到它。
【解决方案2】:

我认为正确的做法是指定一个运行您的 dart 服务器应用程序的自定义入口点,因为 --runtime 仅适用于特定支持的兼容运行时。查看 dev_appserver.py 的错误输出:

google.appengine.tools.devappserver2.errors.InvalidAppConfigError: 
Must set either --runtime or --custom_entrypoint.  
For a standard runtime, set the --runtime flag with one of 
['java-compat', 'java', 'php55', 'python', 'custom', 
'python-compat', 'java7', 'python27', 'go'].  
For a custom runtime, set the --custom_entrypoint with a command to start your app.

【讨论】:

  • 您能详细说明 --custom_entrypoint 的作用吗? dev_appserver.py --help 简单地解释了这个术语:“为自定义运行时模块指定一个入口点”。入口点是什么意思?是文件吗?它是一个程序吗?它是docker容器中的程序吗?运行 dev_appserver.py 的机器?程序应该做什么?
  • 就像听起来一样,一个命令会产生一个监听适当端口的进程,例如node server.jsgunicorn -b localhost:{port} mymodule:application(第二个显示使用{port}作为模板在命令中,它将在运行之前填充适当的值)。
  • 附加到端口后该进程应该做什么?这个过程与我的 Dockerfile 指定的 docker 镜像有什么关系?我应该启动 docker 容器来实现这个过程吗?
  • 正如node server.js 所建议的,应该发生的是该进程将在该端口上侦听HTTP 请求并发送响应。请注意,这只是运行代码的一种方式。您可以简单地运行 node/dart 服务器本身,也可以,正如您刚才所暗示的,从您的 Dockerfile 构建一个映像并在容器中运行它。后者将是生产环境的最准确近似。
  • 啊啊啊啊啊!所以它应该实现模块!!!它是一个实现模块的过程!如果你问我,这根本不是“入口点”的意思。但是,这如何与多个模块一起使用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2019-07-03
  • 2013-12-05
相关资源
最近更新 更多