如何从 Google App Engine 从灵活环境更改为标准环境

How do change from Google App Engine from Flexible Environment to Standard environment

我正在尝试从灵活环境迁移到标准环境。我犯了一个错误,在第一次部署时我的 app.yaml 中有 env: flex。当我使用 env: standard 进行部署时,我得到了确认 Deployed service [default] to [project],尽管部署速度似乎快得令人难以置信。当我请求该应用程序时,出现 500 错误。我在 rails 上使用 ruby。

2020-09-22 03:11:12 default[20200921t205538]  Puma starting in single mode...
2020-09-22 03:11:12 default[20200921t205538]  * Version 4.3.3 (ruby 2.7.1-p83), codename: Mysterious Traveller
2020-09-22 03:11:12 default[20200921t205538]  * Min threads: 5, max threads: 5
2020-09-22 03:11:12 default[20200921t205538]  * Environment: production
2020-09-22 03:11:12 default[20200921t205538]  * Listening on tcp://0.0.0.0:8081
2020-09-22 03:11:12 default[20200921t205538]  bundler: failed to load command: rackup (/workspace/.bundle/gems/ruby/2.7.0/bin/rackup)
2020-09-22 03:11:12 default[20200921t205538]  Errno::ENOENT: No such file or directory @ rb_sysopen - tmp/pids/server.pid
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/puma-4.3.3/lib/puma/launcher.rb:216:in `initialize'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/puma-4.3.3/lib/puma/launcher.rb:216:in `open'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/puma-4.3.3/lib/puma/launcher.rb:216:in `write_pid'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/puma-4.3.3/lib/puma/launcher.rb:105:in `write_state'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/puma-4.3.3/lib/puma/single.rb:103:in `run'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/puma-4.3.3/lib/puma/launcher.rb:172:in `run'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/puma-4.3.3/lib/rack/handler/puma.rb:73:in `run'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/rack-2.2.2/lib/rack/server.rb:327:in `start'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/rack-2.2.2/lib/rack/server.rb:168:in `start'
2020-09-22 03:11:12 default[20200921t205538]    /layers/google.ruby.bundle/gems/.bundle/gems/ruby/2.7.0/gems/rack-2.2.2/bin/rackup:5:in `<top (required)>'
2020-09-22 03:11:12 default[20200921t205538]    /workspace/.bundle/gems/ruby/2.7.0/bin/rackup:23:in `load'
2020-09-22 03:11:12 default[20200921t205538]    /workspace/.bundle/gems/ruby/2.7.0/bin/rackup:23:in `<top (required)>'
2020-09-22 03:11:13 default[20200921t205538]  nginx failed to start: aborted, context canceled. subject:"nginx" Timeout:30m0s, attempts:2
2020-09-22 03:11:13 default[20200921t205538]  "GET /favicon.ico HTTP/1.1" 500

根据描述我认为只有 env: flexenv: standard 被改变了,所以至少 runtime 也应该被改变。

如果您查看文档 (flex and standard),运行时的版本指定不同。在标准环境中它是由 runtime 值选择的,而在灵活环境版本中是在:

.ruby-version file in your application directory

在两种环境中可用的 app.yaml 选项当然还有其他差异(参考文献:flex and standard)。因此,如果您能够在 flex 中部署,则必须检查所有设置。

您的 app.yaml 应该至少有:

runtime: ruby25 # or ruby26 or ruby27 for Ruby 2.6 (beta) or Ruby 2.7 (beta)
entrypoint: bundle exec ruby app.rb

部署到 App Engine 标准。这样做然后删除旧的损坏部署。请注意,无需指定 env.

查看 this 了解更多信息。

您提供的日志中的错误指出:

bundler: failed to load command: rackup (/workspace/.bundle/gems/ruby/2.7.0/bin/rackup)

我看到你正在使用 Puma, and the App Engine Standard docs specify some steps to take for apps that depend on Rack:

Most web applications use a Rack-supported web server such as Puma, Unicorn or Thin.

You must add the server as a dependency in your application's Gemfile configuration file. The runtime will install all dependencies before your entrypoint is called.

source "https://rubygems.org"

gem "rack" 
gem "puma"

An example entrypoint using puma for a Rails application:

entrypoint: bundle exec rails server Puma -p $PORT

instructions for flex 与有关 Gemfile 和入口点的标准环境相同,所以我不确定为什么一个有效而另一个无效,但我鼓励您 double-check如果所有这些说明都得到正确执行。

我认为您的 app.yaml 本身没有任何问题,因为如果您传递了 App Engine 不允许的配置,API 会拒绝部署。

可能与入口点或依赖项有关。这将允许构建容器并部署它,但是当脚本实际尝试启动时会失败。