启动不带Bundle exec的彪马;与bundle exec不兼容; BUNDLE_APP_CONFIG环境变量在RUBYOPT =“-rbundler / setup”运行期间不可用

时间:2018-08-16 14:07:02

标签: ruby-on-rails ruby docker bundler puma

我已经用Rails 5.2应用程序创建了一个docker容器。 Dockerfile在这里:https://pastebin.com/T1hjYtJ8。撰写文件在这里:https://pastebin.com/VEJBT8ZK。它们可能与该问题不完全相关,但是为了以防万一,我仍然提供了指向配置的链接。这是一个非常标准的Dockerfile和compose文件。

应用中使用的puma.rb显示在这里:https://pastebin.com/ic9ig3bC

创建容器时,puma将以bundle exec puma -C config/puma.rb的身份执行。 puma进程在puma_error.log文件中引发错误:

/usr/local/lib/ruby/site_ruby/2.5.0/bundler/spec_set.rb:91:in `block in materialize': Could not find public_suffix-3.0.2 in any of the sources (Bundler::GemNotFound)
    from /usr/local/lib/ruby/site_ruby/2.5.0/bundler/spec_set.rb:85:in `map!'
    from /usr/local/lib/ruby/site_ruby/2.5.0/bundler/spec_set.rb:85:in `materialize'
    from /usr/local/lib/ruby/site_ruby/2.5.0/bundler/definition.rb:171:in `specs'
    ...

这是说它找不到宝石。那个宝石恰好是一个发展宝石。但是我正在将环境设置为staging来启动puma进程。所有必需的环境变量均已正确设置。容器中env的输出如下所示:

RUBYGEMS_VERSION=2.7.7
BUNDLER_VERSION=1.16.3
PUMA_THREADS_MAX=8
EXECJS_RUNTIME=Disabled
HOSTNAME=8d968df601db
RUBY_VERSION=2.5.1
GEM_HOME=/usr/local/bundle
PUMA_THREADS_MIN=2
RAILS_ROOT=/myapp
PWD=/myapp
HOME=/home/deploy
RAILS_SERVE_STATIC_FILES=true
BUNDLE_PATH=/usr/local/bundle
BUNDLE_APP_CONFIG=/usr/local/bundle
RAILS_ENV=staging
RAILS_LOG_TO_STDOUT=true
TERM=xterm
BUNDLE_SILENCE_ROOT_WARNING=1
RUBY_MAJOR=2.5
SHLVL=1
PUMA_NUM_WORKERS=2
PATH=/usr/local/bundle/bin:/usr/local/bundle/gems/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

所以,我不明白为什么捆绑程序安装程序试图加载开发工具。

如果我在没有“ bundle exec”的情况下运行puma进程,例如puma -C config/puma.rb,则该应用程序可以运行!比较具有和不具有“ bundle exec”之间的区别,我注意到问题是RUBYOPT="-rbundler/setup"环境变量,该变量由bundle exec设置。

由于某些原因,捆绑程序设置过程未读取我的环境,并且默认情况下未加载开发环境gem。我如何弄清楚为什么会这样以及如何解决呢?

更新

经过更多调试后,我将问题缩小到此:基础Ruby docker映像将BUNDLE_APP_CONFIG环境变量设置为/usr/local/bundle/。我所有的宝石也都安装到该文件夹​​中。捆绑程序配置也位于此文件夹中(此配置文件具有非常重要的--without / BUNDLE_WITHOUT: "development:test"设置)。 Bundler应该读取此环境变量以找到配置文件。但是,此环境变量在bundler/setup运行时不可用!因此,捆绑程序最终会使用默认配置,该配置将从所有组加载宝石。

要对此进行调查,我在/usr/local/lib/ruby/site_ruby/2.5.0/bundler/setup.rb中添加了以下行:

puts "++++++++++ In setup.rb = All ENV variables: #{ENV.to_h}."

输出如下:

{"RUBYGEMS_VERSION"=>"2.7.7",
 "BUNDLER_VERSION"=>"1.16.3",
 "PUMA_THREADS_MAX"=>"8",
 "EXECJS_RUNTIME"=>"Disabled",
 "HOSTNAME"=>"8d968df601db",
 "RUBY_VERSION"=>"2.5.1",
 "GEM_HOME"=>"/usr/local/bundle",
 "PUMA_THREADS_MIN"=>"2",
 "RAILS_ROOT"=>"/myapp",
 "PWD"=>"/myapp",
 "HOME"=>"/home/deploy",
 "RAILS_SERVE_STATIC_FILES"=>"true",
 "RAILS_ENV"=>"staging",
 "RAILS_LOG_TO_STDOUT"=>"true",
 "TERM"=>"xterm",
 "RUBY_MAJOR"=>"2.5",
 "RUBYLIB"=>"",
 "SHLVL"=>"1",
 "PUMA_NUM_WORKERS"=>"2",
 "PATH"=>"/usr/local/bundle/bin:/usr/local/bundle/gems/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
 "_"=>"/usr/local/bin/bundle",
 "PUMA_BUNDLER_PRUNED"=>"1",
 "RACK_ENV"=>"staging",
 "BUNDLER_ORIG_BUNDLE_BIN_PATH"=>"BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL",
 "BUNDLER_ORIG_BUNDLE_GEMFILE"=>"BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL",
 "BUNDLER_ORIG_BUNDLER_ORIG_MANPATH"=>"BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL",
 "BUNDLER_ORIG_BUNDLER_VERSION"=>"1.16.3",
 "BUNDLER_ORIG_GEM_HOME"=>"/usr/local/bundle",
 "BUNDLER_ORIG_MANPATH"=>"BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL",
 "BUNDLER_ORIG_PATH"=>"/usr/local/bundle/bin:/usr/local/bundle/gems/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
 "BUNDLER_ORIG_RB_USER_INSTALL"=>"BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL",
 "BUNDLER_ORIG_RUBYOPT"=>"BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL",
 "GEM_PATH"=>""}

您会注意到此列表中缺少BUNDLE_APP_CONFIG环境变量。您会注意到该ENV var IS在外壳程序中可用(env的输出)。如果我运行bundle exec env,它也可以使用。

为什么在bundler/setup运行期间删除此环境变量?我假设此删除操作是由捆绑程序完成的,但我可能是错的。我找不到要删除它的地方。

任何帮助将不胜感激。谢谢!

0 个答案:

没有答案