2017-04-26 15 views
1

我注意到当我部署我的sinatra应用程序时,heroku产生了一个神秘的错误。它工作正常,在当地,而事实上,它在Heroku上运行良好,以及 - 但这个错误出现在Heroku的日志我每次部署(且仅在部署):将sinatra应用程序部署到heroku:bundler的神秘错误:未能加载命令:rackup

2017-04-26T08:52:25.579045+00:00 app[web.1]: bundler: failed to load command: rackup (/app/vendor/bundle/ruby/2.3.0/bin/rackup) 
2017-04-26T08:52:25.579176+00:00 app[web.1]: RuntimeError: missing run or map statement 
2017-04-26T08:52:25.579178+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:146:in `to_app' 
2017-04-26T08:52:25.579179+00:00 app[web.1]: /app/config.ru:5:in `<main>' 
2017-04-26T08:52:25.579180+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:49:in `eval' 
2017-04-26T08:52:25.579180+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:49:in `new_from_string' 
2017-04-26T08:52:25.579181+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/builder.rb:40:in `parse_file' 
2017-04-26T08:52:25.579182+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:299:in `build_app_and_options_from_config' 
2017-04-26T08:52:25.579183+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:208:in `app' 
2017-04-26T08:52:25.579184+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:336:in `wrapped_app' 
2017-04-26T08:52:25.579184+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:272:in `start' 
2017-04-26T08:52:25.579185+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:147:in `start' 
2017-04-26T08:52:25.579186+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.5/bin/rackup:4:in `<top (required)>' 
2017-04-26T08:52:25.579187+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/bin/rackup:23:in `load' 
2017-04-26T08:52:25.579215+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/bin/rackup:23:in `<top (required)>' 
2017-04-26T08:52:25.724981+00:00 heroku[web.1]: Process exited with status 1 
2017-04-26T08:52:26.928566+00:00 heroku[web.1]: Starting process with command `bundle exec rackup config.ru -p 56963` 
2017-04-26T08:52:29.278571+00:00 app[web.1]: [2017-04-26 08:52:29] INFO WEBrick 1.3.1 
2017-04-26T08:52:29.278590+00:00 app[web.1]: [2017-04-26 08:52:29] INFO ruby 2.3.1 (2016-04-26) [x86_64-linux] 
2017-04-26T08:52:29.278909+00:00 app[web.1]: == Sinatra (v1.4.8) has taken the stage on 56963 for production with backup from WEBrick 
2017-04-26T08:52:29.279274+00:00 app[web.1]: [2017-04-26 08:52:29] INFO WEBrick::HTTPServer#start: pid=4 port=56963 
2017-04-26T08:52:29.825875+00:00 heroku[web.1]: State changed from starting to up 

其他职位提出,这可能由于config.ru中的错误。煤矿只包含:

require './lib/app' 
SinatraApp.run! 

这里是我的Procfile

web: bundle exec rackup config.ru -p $PORT 

heroku deploy log is here,在情况下,它是有帮助的。正如我所说,该应用程序似乎工作正常(您可以看到它在上述成绩单结束时成功启动),但我无法理解在每个部署中导致此错误的原因。

谢谢。

+0

你确定你提供正确的'config.ru'引发的错误?回溯表明它至少有5行:'/app/config.ru:5:in

',并且您包含的源只有两行。 –

+0

好点。我也注意到了这一点。在我的项目中只有一个'config.ru'(我重复检查)。 heroku是否正在部署某种默认的'config.ru'?在heroku文档中我找不到任何这方面的证据,当我连接到我的dyno并检查文件时,它没有任何变化。 –

回答

1

你很困惑Rack’s run methodSinatra’s run! method

当使用rackup时,Rack期望您的config.ru指定要运行的应用程序。您可以使用run(或map)方法执行此操作。您的config.ru没有任何一种,所以当rackup运行时,它会报告您看到的错误:missing run or map statement

Sinatra有自己的run!方法。当你打电话给这个Sinatra将启动一个Web服务器并为你的应用程序提供服务。该服务器将遵守各种Sinatra设置(例如set :server, 'puma'等)。 rackup不使用此设置。 (我怀疑你的应用中有类似set :port, ENV['PORT']的行)。

config.ru应该是这个样子,应该停止错误:

require './lib/app' 
run SinatraApp 

发生的事情是,当你开始rackup它会分析你config.ru配置的应用运行。在此期间,由于该文件是纯Ruby,因此您需要启动内置的Sinatra服务器。这会停止整理,并让内置服务器运行。

当你以后停止服务器时,你只能停止这个内置服务器。机架将继续阅读config.ru,希望找到一个应用程序运行,以便它也可以启动服务器。当它没有发现任何东西会引发错误。

在你的情况,我认为正在发生的是正在从以前运行服务器时,你部署一个新的版本

+0

谢谢。 [这](HTTPS://gist.github。com/lrettig/6c74f79217e02dd012cdb743f1a59c56)是我在关闭/重新启动时在日志中看到的,在进行了您建议的更改后。这是它应该看起来像什么? –

+0

@LaneRettig是的,我想是的。这些例外情况是Webrick对Heroku发送的SIGTERM作出的响应。如果您[切换到例如彪马](https://devcenter.heroku.com/articles/ruby-default-web-server)你不应该看到这些。 – matt

+0

我打算将这个答案标记为正确的(谢谢!),但我仍然有点被日志中所有显而易见的无害错误消息剔除! –