【问题标题】:I can't deploy a working rails 6 app on cloud foundry due to bundle version由于捆绑版本,我无法在 Cloud Foundry 上部署可用的 Rails 6 应用程序
【发布时间】:2021-02-27 20:58:15
【问题描述】:

即使我的 gemfile 中有更高版本的 bundler,我也遇到了这个问题。可能是什么问题导致了这种情况?

APP/PROC/WEB    0   from /home/vcap/app/bin/bundle:3:in `<main>'    
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   from /usr/lib/ruby/2.5.0/rubygems.rb:263:in `bin_path'  
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   To install the missing version, run `gem install bundler:2.1.4` 
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   To update to the lastest version installed on your system, run `bundle update --bundler`.   
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   /usr/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': Could not find 'bundler' (2.1.4) required by your /home/vcap/app/Gemfile.lock. (Gem::GemNotFoundException)  
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   /usr/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': Could not find 'bundler' (2.1.4) required by your /home/vcap/app/Gemfile.lock. (Gem::GemNotFoundException)  
Feb 18, 2021, 08:57:02 PM
APP/PROC/WEB    0   To update to the lastest version installed on your system, run `bundle update --bundler`.

【问题讨论】:

    标签: bundler cloud-foundry ruby-on-rails-6


    【解决方案1】:

    Ruby buildpack 不能承载每个版本的 Ruby 和 bundler,它会导致一个非常大的 buildpack。因此,所有 buildpack 将仅保留它们包含在每个 buildpack 版本中的软件的一组选定版本。 Buildpacks 旨在鼓励您跟上软件的最新版本,因此随着 buildpacks 的更新和新版本的减少,buildpacks 将丢弃旧版本的软件。

    这意味着您有三个选择:

    1. 您可以查看您的 buildpack 的发行说明或 build pack dependency viewer,以查看 buildpack 版本是否包含您需要的特定软件版本。

      例如,如果您必须拥有 bundler 2.1.4,那么您需要查看 find the latest buildpack version which contains it。提示,它是 v1.8.27。您可以使用buildpack release notes also 确认相同的信息。

      找到特定的 buildpack 版本后,您需要告诉 Cloud Foundry 您想要该 buildpack 版本,其中包含您需要的软件版本。例如:cf push -b https://github.com/cloudfoundry/ruby-buildpack#v1.8.27

      但这有一些缺点,a.) Cloud Foundry 必须能够与 Internet 通信并下载该 buildpack 以及 b.) 您被该 buildpack 中的软件版本所困扰,因此您的应用可能容易受到已在 buildpack 安装的较新版本软件中解决的安全问题。

    2. 大多数时候,您并不关心 Ruby、Bundler 或其他库的具体版本,而您想要的是 declare a more flexible version in your project,例如“我想要 Bundler 2”。此时,您将获得最新的 Bundler 2.x.y 版本支持,只要您使用的 buildpack 仍包含某些版本的 Bundler 2(甚至主要版本也会随着时间的推移而推出)。

    3. 如果您确实需要继续指定 Bundler(或其他软件)的确切版本,则需要定期更新您的应用程序及其使用的软件版本,以便与 buildpack 安装的更新版本一起使用.

      例如,在我撰写本文时,最新的 Ruby buildpack 1.8.32 包含 Bundler 2.2.11。这意味着您需要更新您的应用才能使用此版本。

    一般来说,最无摩擦和最安全的选择是#2。您将继续获得软件更新,并且它应该继续部署而不会出现问题。不利的一面是,随着时间的推移,您可能会获得与您的应用程序不兼容的更新。然后,您必须先解决此问题,然后才能继续部署您的应用。

    选项#3 也可以,但它需要大量的微观管理。如果您真的不需要那种级别的控制,我建议您使用选项#2。你会得到类似的结果,而且会更省力。

    选项 #1 应该是最后的手段,并且仅在您的应用绝对没有其他选项时使用,或者您可能需要在升级应用以与新版本兼容时花一些时间。 随着时间的推移,此版本会使您的应用容易受到安全漏洞的影响。

    您可能会认为这一切听起来像是一种巨大的痛苦,但事实并非如此。它是 buildpack 迫使您考虑您的软件依赖关系并强制进行良好的升级卫生。这是一件非常好的事情,因为它可以使您的软件保持最新,并保护您的应用程序免受其使用的软件中的漏洞的影响。

    【讨论】:

    • 非常感谢。我会按照你的建议选择选项 2,如果有的话,我一定会回到这里询问更多问题。
    猜你喜欢
    • 2018-09-06
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多