在Phusion Passenger Docker镜像上出现错误“在任何源中找不到rake-10.5.0”

我正在尝试使用Docker和Phusion Passenger Ruby基本映像来部署Rails应用程序,但每当我尝试从浏览器访问应用程序时,都会遇到以下错误:

web_1 | [ 2016-02-08 04:18:44.6861 31/7ff292141700 age/Cor/App/Implementation.cpp:304 ]: Could not spawn process for application /home/app/webapp: An error occurred while starting up the preloader. web_1 | Error ID: d3103e16 web_1 | Error details saved to: /tmp/passenger-error-EwymlW.html web_1 | Message from application: <p>It looks like Bundler could not find a gem. Maybe you didn't install all the gems that this application needs. To install your gems, please run:</p> web_1 | web_1 | <pre class="commands">bundle install</pre> web_1 | web_1 | <p>If that didn't work, then the problem is probably caused by your application being run under a different environment than it's supposed to. Please check the following:</p> web_1 | web_1 | <ol> web_1 | <li>Is this app supposed to be run as the <code>app</code> user?</li> web_1 | <li>Is this app being run on the correct Ruby interpreter? Below you will web_1 | see which Ruby interpreter Phusion Passenger attempted to use.</li> web_1 | </ol> web_1 | web_1 | <p>-------- The exception is as follows: -------</p> web_1 | Could not find rake-10.5.0 in any of the sources (Bundler::GemNotFound) web_1 | <pre> /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/spec_set.rb:92:in `block in materialize' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/spec_set.rb:85:in `map!' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/spec_set.rb:85:in `materialize' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/definition.rb:140:in `specs' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/definition.rb:185:in `specs_for' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/definition.rb:174:in `requested_specs' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/environment.rb:18:in `requested_specs' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/runtime.rb:13:in `setup' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler.rb:127:in `setup' web_1 | /var/lib/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/setup.rb:18:in `&lt;top (required)&gt;' web_1 | /usr/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require' web_1 | /usr/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require' web_1 | /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:430:in `activate_gem' web_1 | /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:297:in `block in run_load_path_setup_code' web_1 | /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:435:in `running_bundler' web_1 | /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:296:in `run_load_path_setup_code' web_1 | /usr/share/passenger/helper-scripts/rack-preloader.rb:100:in `preload_app' web_1 | /usr/share/passenger/helper-scripts/rack-preloader.rb:156:in `&lt;module:App&gt;' web_1 | /usr/share/passenger/helper-scripts/rack-preloader.rb:30:in `&lt;module:PhusionPassenger&gt;' web_1 | /usr/share/passenger/helper-scripts/rack-preloader.rb:29:in `&lt;main&gt;'</pre> web_1 | web_1 | web_1 | [ 2016-02-08 04:18:44.6935 31/7ff293143700 age/Cor/Con/CheckoutSession.cpp:277 ]: [Client 1-2] Cannot checkout session because a spawning error occurred. The identifier of the error is d3103e16. Please see earlier logs for details about the error. 

这是我的Dockerfile

 FROM phusion/passenger-ruby22:0.9.18 # Set correct environment variables. ENV HOME /root # Use baseimage-docker's init process. CMD ["/sbin/my_init"] # Enable Nginx/Passenger RUN rm -f /etc/service/nginx/down # Enable portals virtual host RUN rm /etc/nginx/sites-enabled/default COPY portals.conf /etc/nginx/sites-enabled/portals.conf RUN mkdir /home/app/webapp # Load env vars into nginx COPY rails-env.conf /etc/nginx/main.d/rails-env.conf # Install gems dependencies COPY Gemfile* /tmp/ WORKDIR /tmp RUN bundle install # Copy rails app WORKDIR /home/app/webapp COPY . ./ RUN chown -R app:app ./ # Clean up APT when done. RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

我尝试运行捆绑软件作为RUN bundle install --deployment但它没有工作。 我通过rails-env.conf文件传递RAILS_ENVrails-env.conf ,它们都被设置为生产(根据Passenger图像文档,这是默认设置)。

如果我将docker exec -it bash <ID>放入容器并运行gem list我会看到所有的gem都已经安装好了,所以我不知道什么是错的。

这个错误是由于过时的软件。 由于乘客图像不会经常更新,因此必须将所有内容都更新到Dockerfile 。 这是我通常基于一个phusion映像build立一个Dockerfile

 FROM phusion/passenger-ruby22:0.9.18 ENV SYSTEM_UPDATE=1 RUN apt-get update \ && apt-get upgrade -y -o Dpkg::Options::="--force-confold" \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* WORKDIR /home/app COPY Gemfile /home/app/Gemfile COPY Gemfile.lock /home/app/Gemfile.lock RUN gem update --system && \ gem update bundler && \ bundle install --jobs 4 --retry 5 # The rest of your app setup here ENTRYPOINT ["/sbin/my_init", "--"] 

SYSTEM_UPDATE只是一个高速缓冲存储器variables。 当我碰到所有的软件包将在下一个docker版本更新。 它应该经常碰撞。

在运行bundle install之前,我也确保gembundler完全是最新的。

另外,将GemfileGemfile.lock复制到tmp目录并没有任何好处,只需将其复制到应用程序目录即可。

完成后,您可以删除最终的Clean up APT when done. 命令 – 这真的不是正确的地方。 应该有一个单独的RUN行,在单层中运行所有apt-get命令。

查看https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/了解设置Dockerfile的最佳实践,特别是关于使用apt-get的部分&#x3002;

对我来说,耙在那里,我使用它来修复它

rake rails:update

玩的开心!