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

Posted

技术标签:

【中文标题】在 Rails Docker 容器中捆绑安装失败【英文标题】:Bundle install fails in Rails Docker container 【发布时间】:2016-07-24 12:48:52 【问题描述】:

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

我对@9​​87654325@ 比较陌生,我不会称自己为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 找不到 宝石。也许你没有安装这个应用程序的所有 gem 需要。要安装您的 gem,请运行:

捆绑安装

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

    这个应用程序是否应该以app 运行 用户? 此应用程序是否在正确的 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
'
/usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in
require'
/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'
/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'
/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'
/usr/share/passenger/helper-scripts/rack-preloader.rb:156:in
'
/usr/share/passenger/helper-scripts/rack-preloader.rb:30:in
<module:PhusionPassenger>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:29:in
'

【问题讨论】:

【参考方案1】:

这里的变量太多了。目前尚不清楚您的问题中的“部署”是什么意思? “当我尝试部署时”——是像 docker run ...docker-compose ... 这样的东西吗?还是 Heroku/AWS/DigitalOcean/CF 类型的推送?您是在本地、boot2Docker、远程运行 Docker 吗?

一般来说,是否有可能在容器内没有出站连接?你在代理后面吗?如果是这样,则可能需要在容器内传递相同的代理设置——如何发生取决于代理设置和 Docker 细节。

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

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

【讨论】:

以上是关于在 Rails Docker 容器中捆绑安装失败的主要内容,如果未能解决你的问题,请参考以下文章

Capistrano 捆绑器:安装失败

Ruby on Rails。捆绑器。黄瓜。耙中止!命令失败,状态为 (1)

捆绑安装失败并出现 SSL 证书验证错误

使用 Ruby On Rails 4.2.5.1 我可以 gem install therubyracer 但捆绑包在 OS X 10.11.1 上失败

使用 Intellij/Rubymine 在 docker 中调试 rails 应用程序

Rails 捆绑安装仅生产