Bundler 2.2.0 和 Ruby 2.7.5 在 Docker 崩溃
Bundler 2.2.0 and Ruby 2.7.5 on Docker crashing
我安装了 Ruby 2.7.5,在 Dockerfile 中,指定要安装的捆绑器(版本 2.2.0):
RUN gem install bundler -v 2.2.0 --no-document
这个输出是:
INFO[0093] RUN gem install bundler -v 2.2.0 --no-document
INFO[0093] cmd: /bin/sh
INFO[0093] args: [-c gem install bundler -v 2.2.0 --no-document]
INFO[0093] Running: [/bin/sh -c gem install bundler -v 2.2.0 --no-document]
Successfully installed bundler-2.2.0
在该安装中一切似乎都很好,并且 bundle
可以作为 Gemfile
中指定的 gem 安装。但是,当我尝试打开控制台时,我看到了:
/usr/lib/ruby/2.7.0/rubygems.rb:277:in `find_spec_for_exe': Could not find 'bundler' (2.2.0) required by your /app/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.2.0`
但是,安装了。正如你从上面看到的。此外,当我在 Dockerfile 中输出版本时,我看到:
Bundler version 2.2.0
貌似安装没问题,但是还是出现上面的错误,直接闪退
我做错了什么吗?
使用更新的捆绑程序版本构建 Docker 图像
您在 Docker 捆绑 gem 文件构建中遗漏了几个步骤。更新 Bundler 后,您还需要更新 Gemfile.lock 并且可能 re-run bundle install
。涉及的选项很多,但这是我根据您的 post:
对您的 Docker 文件的个人建议
# Note: Don't lock your Bundler version unless you
# have a VERY good reason to do so. Update will
# install or update, as needed.
RUN gem update bundler --no-document \
&& gem clean bundler \
&& bundle update --bundler \
&& bundle install
这里的关键是,如果您不使用 bundle update --bundler
,那么 Gemfile.lock 将不包含您期望调用的 Bundler 版本。如有必要,最新版本的 Bundler 将 将自己降级 到 Gemfile.lock 中的版本,因此这确实是整个事情的关键。
此外,如果在应用上述方法后问题仍然存在,您可能需要弄清楚 Bundler 在容器映像中的实际安装位置。虽然 Bundler(目前)没有从你的包中 运行,但所需的版本仍然需要在 GEM_HOME、[=38 中=] 或 GEM_PATH 以便在您调用它时被发现。
作为最后的考虑因素,如果您在本地构建您的 gem 或修改您的 Gemfile.lock,然后使用 ADD 或 COPY 命令将 Gemfile.lock 或任何销售的 gem 放入您的容器镜像中,您需要在 Docker 之外而不是在 Docker 文件内执行这些活动。根据您原来的 post 看起来您现在并没有这样做,但这是您在解决此问题时要考虑的另一种选择。
我安装了 Ruby 2.7.5,在 Dockerfile 中,指定要安装的捆绑器(版本 2.2.0):
RUN gem install bundler -v 2.2.0 --no-document
这个输出是:
INFO[0093] RUN gem install bundler -v 2.2.0 --no-document
INFO[0093] cmd: /bin/sh
INFO[0093] args: [-c gem install bundler -v 2.2.0 --no-document]
INFO[0093] Running: [/bin/sh -c gem install bundler -v 2.2.0 --no-document]
Successfully installed bundler-2.2.0
在该安装中一切似乎都很好,并且 bundle
可以作为 Gemfile
中指定的 gem 安装。但是,当我尝试打开控制台时,我看到了:
/usr/lib/ruby/2.7.0/rubygems.rb:277:in `find_spec_for_exe': Could not find 'bundler' (2.2.0) required by your /app/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.2.0`
但是,安装了。正如你从上面看到的。此外,当我在 Dockerfile 中输出版本时,我看到:
Bundler version 2.2.0
貌似安装没问题,但是还是出现上面的错误,直接闪退
我做错了什么吗?
使用更新的捆绑程序版本构建 Docker 图像
您在 Docker 捆绑 gem 文件构建中遗漏了几个步骤。更新 Bundler 后,您还需要更新 Gemfile.lock 并且可能 re-run bundle install
。涉及的选项很多,但这是我根据您的 post:
# Note: Don't lock your Bundler version unless you
# have a VERY good reason to do so. Update will
# install or update, as needed.
RUN gem update bundler --no-document \
&& gem clean bundler \
&& bundle update --bundler \
&& bundle install
这里的关键是,如果您不使用 bundle update --bundler
,那么 Gemfile.lock 将不包含您期望调用的 Bundler 版本。如有必要,最新版本的 Bundler 将 将自己降级 到 Gemfile.lock 中的版本,因此这确实是整个事情的关键。
此外,如果在应用上述方法后问题仍然存在,您可能需要弄清楚 Bundler 在容器映像中的实际安装位置。虽然 Bundler(目前)没有从你的包中 运行,但所需的版本仍然需要在 GEM_HOME、[=38 中=] 或 GEM_PATH 以便在您调用它时被发现。
作为最后的考虑因素,如果您在本地构建您的 gem 或修改您的 Gemfile.lock,然后使用 ADD 或 COPY 命令将 Gemfile.lock 或任何销售的 gem 放入您的容器镜像中,您需要在 Docker 之外而不是在 Docker 文件内执行这些活动。根据您原来的 post 看起来您现在并没有这样做,但这是您在解决此问题时要考虑的另一种选择。