【发布时间】:2020-04-10 23:05:30
【问题描述】:
我的团队使用 Dockerfile 托管我们的 Rails 应用程序。我们有一些缓慢的宝石确实会减慢我们的构建速度。 (我在看你grpc。????)
是否可以在将 Gemfile 复制到我们的 Dockerfile 之前安装一些 gem?这将允许 Docker 缓存这些构建步骤,因此我们不必在每次 Gemfile 更改时重新安装缓慢的 gem。
我试过了,但bundle install 仍在安装grpc、sassc 和nokogiri。
RUN gem install grpc --version 1.28.0
RUN gem install sassc --version 2.2.1
RUN gem install nokogiri --version 1.10.9
WORKDIR /app
ADD Gemfile Gemfile.lock .ruby-version /app/
RUN bundle install
【问题讨论】:
-
bundle install --deploymentfrom bundler.io/guides/deploying.html#manual-deployment 应该让您走上正轨。本质上,您以这种方式编译 gems,然后将它们添加到vendor/bundle,并且不必每次都重新编译。 -
为什么您认为在
bundle install命令之外安装它们会节省您的时间?同样使用--deployment和 vendor 文件夹也无济于事 - docker 层缓存应该已经处理好它,并且不应该运行这个bundler install层,除非 Gemfile 中有任何更改。 -
@DannyB Docker 缓存其安装的每一层。如果我可以在引入 Gemfile 之前安装它们,那么该图像层将在后续构建中缓存。
-
@anothermh 感谢您的回复!我不太确定这能解决我的问题。特别慢的 gem 需要在本地编译,而且您的解决方案似乎仍然需要 Gemfile。
-
我错过了标题的“没有 Gemfile”部分,因为在 Dockerfile 中指定了 Gemfile。现在我很困惑。但解决方案似乎是跳过你的
RUN gem指令,使用ADD Gemfile Gemfile.lock,添加RUN bundle install,然后 执行ADD /app/。
标签: ruby-on-rails ruby docker bundle bundler