我已经用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
运行期间删除此环境变量?我假设此删除操作是由捆绑程序完成的,但我可能是错的。我找不到要删除它的地方。
任何帮助将不胜感激。谢谢!