2017-04-26 14 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

我打算將這個答案標記爲正確的(謝謝!),但我仍然有點被日誌中所有顯而易見的無害錯誤消息剔除! –