在Dokku上部署ruby应用程序:为什么Bundler配置强制"没有生产"?

时间:2016-03-31 17:48:09

标签: ruby heroku bundler gemfile dokku

使用Dokku 0.5.3,我在部署Ruby / Rack应用程序时遇到问题:Bundler没有在B组中安装我的宝石。

这是我的Gemfile:

:production

这是我将回购推送给dokku时的输出:

source 'https://rubygems.org'

ruby '2.3.0'

gem 'bundler'
gem 'sinatra'
gem 'sinatra-contrib'
gem 'json'
gem 'thin'
gem 'instagram'
gem 'data_mapper'
gem 'dm-types',
  :git => 'git://github.com/julienma/dm-types.git',
  :branch => 'gem-v1.2.2-with-frozen-nilclass-fix'

gem 'dm-postgres-adapter', :group => :production

group :development, :test do
  gem 'dm-sqlite-adapter'
  gem 'dotenv'
  gem 'pry'
end

ruby​​错误是因为它不需要Counting objects: 114, done. Delta compression using up to 4 threads. Compressing objects: 100% (91/91), done. Writing objects: 100% (114/114), 13.76 KiB | 0 bytes/s, done. Total 114 (delta 53), reused 0 (delta 0) -----> Cleaning up... -----> Building my-app from herokuish... -----> Adding BUILD_ENV to build environment... -----> Ruby app detected -----> Compiling Ruby/Rack -----> Using Ruby version: ruby-2.3.0 -----> Installing dependencies using bundler 1.11.2 Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment Fetching gem metadata from https://rubygems.org/......... Fetching version metadata from https://rubygems.org/... Fetching dependency metadata from https://rubygems.org/.. Fetching git://github.com/julienma/dm-types.git Installing bcrypt 3.1.11 with native extensions Installing backports 3.6.8 Installing addressable 2.4.0 Installing daemons 1.2.3 Using json 1.8.3 Installing fastercsv 1.5.5 Installing json_pure 1.8.3 Installing multi_json 1.11.2 Installing stringex 1.5.1 Installing uuidtools 2.1.5 Installing multipart-post 2.0.0 Installing eventmachine 1.2.0.1 with native extensions Installing hashie 3.4.3 Installing rack 1.6.4 Installing tilt 2.0.2 Using bundler 1.11.2 Installing bcrypt-ruby 3.1.5 Installing dm-core 1.2.1 Installing faraday 0.9.2 Installing rack-protection 1.5.3 Installing rack-test 0.6.3 Installing faraday_middleware 0.9.2 Installing dm-aggregates 1.2.0 Installing dm-constraints 1.2.0 Installing dm-migrations 1.2.0 Installing dm-serializer 1.2.2 Installing dm-transactions 1.2.0 Using dm-types 1.2.2 from git://github.com/julienma/dm-types.git (at gem-v1.2.2-with-frozen-nilclass-fix@b34937c) Installing dm-timestamps 1.2.0 Installing dm-validations 1.2.0 Installing sinatra 1.4.7 Installing instagram 1.1.6 Installing sinatra-contrib 1.4.6 Installing data_mapper 1.2.0 Installing thin 1.6.4 with native extensions Bundle complete! 12 Gemfile dependencies, 35 gems now installed. Gems in the groups development, test and production were not installed. Bundled gems are installed into ./vendor/bundle. Bundle completed (42.90s) Cleaning up the bundler cache. --- addons: [] config_vars: LANG: en_US.UTF-8 RACK_ENV: production default_process_types: rake: bundle exec rake console: bundle exec irb web: bundle exec thin start -R config.ru -e $RACK_ENV -p $PORT -----> Discovering process types Procfile declares types -> web -----> Releasing my-app (dokku/my-app:latest)... -----> Deploying my-app (dokku/my-app:latest)... -----> Attempting to run scripts.dokku.predeploy from app.json (if defined) -----> App Procfile file found (/home/dokku/my-app/DOKKU_PROCFILE) -----> DOKKU_SCALE file not found in app image. Generating one based on Procfile... -----> New DOKKU_SCALE file generated =====> web=1 -----> Running pre-flight checks For more efficient zero downtime deployments, create a file CHECKS. See http://dokku.viewdocs.io/dokku/checks-examples.md for examples CHECKS file not found in container: Running simple container check... -----> Waiting for 10 seconds ... remote: App container failed to start!! =====> my-app web container output: /app/vendor/bundle/ruby/2.3.0/gems/backports-3.6.8/lib/backports/std_lib.rb:9:in `require': cannot load such file -- dm-postgres-adapter (LoadError) from /app/vendor/bundle/ruby/2.3.0/gems/backports-3.6.8/lib/backports/std_lib.rb:9:in `require_with_backports' from /app/vendor/bundle/ruby/2.3.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:163:in `load_adapter' from /app/vendor/bundle/ruby/2.3.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:133:in `adapter_class' from /app/vendor/bundle/ruby/2.3.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:13:in `new' from /app/vendor/bundle/ruby/2.3.0/gems/dm-core-1.2.1/lib/dm-core.rb:230:in `setup' from /app/controllers/app.rb:38:in `<top (required)>' from /app/config.ru:1:in `require' from /app/config.ru:1:in `block in <main>' from /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/builder.rb:55:in `instance_eval' from /app/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/builder.rb:55:in `initialize' from /app/config.ru:1:in `new' from /app/config.ru:1:in `<main>' from /app/vendor/bundle/ruby/2.3.0/gems/thin-1.6.4/lib/rack/adapter/loader.rb:33:in `eval' from /app/vendor/bundle/ruby/2.3.0/gems/thin-1.6.4/lib/rack/adapter/loader.rb:33:in `load' from /app/vendor/bundle/ruby/2.3.0/gems/thin-1.6.4/lib/rack/adapter/loader.rb:42:in `for' from /app/vendor/bundle/ruby/2.3.0/gems/thin-1.6.4/lib/thin/controllers/controller.rb:170:in `load_adapter' from /app/vendor/bundle/ruby/2.3.0/gems/thin-1.6.4/lib/thin/controllers/controller.rb:74:in `start' from /app/vendor/bundle/ruby/2.3.0/gems/thin-1.6.4/lib/thin/runner.rb:200:in `run_command' from /app/vendor/bundle/ruby/2.3.0/gems/thin-1.6.4/lib/thin/runner.rb:156:in `run!' from /app/vendor/bundle/ruby/2.3.0/gems/thin-1.6.4/bin/thin:6:in `<top (required)>' from /app/vendor/bundle/ruby/2.3.0/bin/thin:23:in `load' from /app/vendor/bundle/ruby/2.3.0/bin/thin:23:in `<main>' Using rack adapter =====> end my-app web container output To ssh://dokku@my-host.com:22/my-app ! [remote rejected] patch-dm-postgres-adapter-deploy -> master (pre-receive hook declined) error: failed to push some refs to 'ssh://dokku@my-host.com:22/my-app' ,因为它的gem尚未安装。 Bundler还声明dm-postgres-adapter

以下是我所知道的:

  • 我的本地Gems in the groups development, test and production were not installed.包含.bundler/config,但这是BUNDLE_WITHOUT: production&#39; d。
  • 在dokku实例上,这是.gitignore给我的:

    dokku run my-app bundle config

我可以理解Settings are listed in order of priority. The top value will be used. without Set for your local app (/app/.bundle/config): "development:test:production" Set via BUNDLE_WITHOUT: "development:test" Set for the current user (/app/.bundle/config): "development:test:production" ... 条款的development:test来自何处,但我真的很想知道without是如何以及为何也存在。

我还尝试在第一次部署之前设置ENV var production 。它被考虑在内,但它之前是本地捆绑包配置,它已经排除了BUNDLE_WITHOUT: development:test

我通过手动修改production并删除/home/dokku/my-app/cache/.bundle/config

解决了这个问题
production

再次推送后,Bundler成功安装了我的 BUNDLE_WITHOUT: development:test 宝石。

但我不想手动编辑服务器上的配置文件以使其正常工作。

所以,问题:

  • 为什么在Dokku上部署时,Bundler会忽略production组?
  • 如何强制安装production宝石?

谢谢!

1 个答案:

答案 0 :(得分:0)

我们使用heroku buildpack,因此最新的buildpack可能存在设置正确默认值的问题吗?