在Rails Docker容器中捆绑安装失败

时间:2016-04-04 19:58:25

标签: ruby-on-rails docker rubygems bundler

我在部署docker容器时遇到问题,主要原因是bundler无法执行它的install命令。使用bundle install在本地运行passenger似乎工作正常,只有部署过程在设置gem时会导致问题。

我对Docker相对较新,我不会称自己为Rails专家。也就是说,我很难理解bundler是如何设法以这种方式混淆整个事情(特别是与Docker一起)。

我正在使用乘客码头基础图像,如果它有任何相关性。

这是我的Gemfile

gem 'doorkeeper'
gem 'doorkeeper-jwt'
gem 'aws-sdk-rails'
gem 'rack-cors', :require => 'rack/cors'
gem 'active_model_serializers', github: 'rails-api/active_model_serializers'
gem 'passenger'
gem 'rails', '4.2.6'
gem 'rails-api'
gem 'pg'
gem 'devise'
gem 'schema_plus'
gem 'pusher'
gem 'sdoc', '~> 0.4.0', group: :doc

group :development, :test do

  gem 'byebug'
  gem 'web-console', '~> 2.0'
  gem 'spring'
  gem 'rspec-rails'
  gem 'factory_girl_rails', '~> 4.0'
  gem 'database_cleaner'

end

以下是Dockerfile

的(部分)
RUN mkdir /home/app/myapp
WORKDIR /home/app/myapp

COPY Gemfile /home/app/myapp/
COPY Gemfile.lock /home/app/myapp/
RUN chown -R app:app /home/app/myapp
RUN sudo -u app bundle install --deployment --verbose --path vendor/cache

ADD . /home/app/myapp
RUN chown -R app:app /home/app/myapp

当我尝试部署时,出现以下错误:

  

来自应用程序的消息:

看起来Bundler找不到了   宝石。也许你没有安装这个应用程序的所有宝石   需要。要安装宝石,请运行:

     

捆绑安装

     

如果这不起作用,则问题可能是由您造成的   应用程序在不同于预期的环境下运行   至。请检查以下内容:

     
  1. 这个应用程序是否应该作为app运行   用户?
  2. 此应用程序是否在正确的Ruby上运行   翻译吗?下面你会         看看Phusion Passenger试图使用哪个Ruby解释器。
     

--------例外情况如下:-------

找不到   任何来源中的rake-11.1.2(Bundler :: GemNotFound)
 
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/spec_set.rb:92:in
block in materialize'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/spec_set.rb:85:in
map!'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/spec_set.rb:85:in materialize'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/definition.rb:140:in
specs'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/definition.rb:185:in specs_for'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/definition.rb:174:in
requested_specs'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/environment.rb:18:in requested_specs'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/runtime.rb:13:in
setup'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler.rb:127:in setup'
/var/lib/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/setup.rb:18:in
<top (required)>'
/usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in require&#39;
/usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in
require'
/usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:430:in activate_gem&#39;
/usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:297:in
block in run_load_path_setup_code'
/usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:435:in running_bundler&#39;
/usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:296:in
run_load_path_setup_code'
/usr/share/passenger/helper-scripts/rack-preloader.rb:100:in preload_app&#39;
/usr/share/passenger/helper-scripts/rack-preloader.rb:156:in
<module:App>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:30:in &lt;module:PhusionPassenger&gt;&#39;
/usr/share/passenger/helper-scripts/rack-preloader.rb:29:in
<main>'

1 个答案:

答案 0 :(得分:0)

这里有太多变数。目前尚不清楚什么是部署&#39;你的问题意味着什么? &#34;当我尝试部署&#34; - 是docker run ...还是docker-compose ...?或者是Heroku / AWS / DigitalOcean / CF型推?你是本地运行Docker,boot2Docker,远程?

通常,是否可能从容器内部没有出站连接?你是代理人吗?如果是这样,可能需要在容器内部继承相同的代理设置 - 以及如何发生这取决于代理设置和Docker细节。

如果您能够将任何网络工具的安装添加到Dockerfile,请尝试使用docker exec <container_id> curl rubygems.org之类的内容(或者如果您还没有正在运行的容器,docker run <image_id> curl rubygems.org

希望这有助于您开始朝着正确的方向前进。