加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 更新gem时Docker bundle安装缓存问题

发布时间:2020-12-17 03:18:12 所属栏目:百科 来源:网络整理
导读:我在开发和生产中都使用了docker,真正让我烦恼的是docker cache simple.我有 ruby应用程序,需要bundle install来安装依赖项,所以我从以下Dockerfile开始: 添加Gemfile Gemfile 添加Gemfile.lock Gemfile.lock RUN bundle install –path / root / bundle 所
我在开发和生产中都使用了docker,真正让我烦恼的是docker cache simple.我有 ruby应用程序,需要bundle install来安装依赖项,所以我从以下Dockerfile开始:

添加Gemfile Gemfile
添加Gemfile.lock Gemfile.lock
RUN bundle install –path / root / bundle

所有依赖项都被缓存,并且在我添加新gem之前它很有效.即使我添加的gem只有0.5 MB,从头开始安装所有应用程序宝石仍需要10-15分钟.然后由于依赖项文件夹的大小(约300MB)再部署10分钟.

我遇到了与node_modules和npm完全相同的问题.我在想,有没有人找到解决这个问题的方法?

我的研究结果到目前为止:

> Source to image – 跨增量构建缓存任意文件.不幸的是,由于它的工作方式,它需要将整个300MB推送到注册表,即使宝石没有改变.更快的构建 – >即使未更新宝石,也会降低部署速度.
> Gemfile.tip – 将Gemfile拆分为两个不同的文件,只将gems添加到其中一个文件中.对捆绑器的非常具体的解决方案,我不相信它将超出添加1-2宝石的规模.
> Harpoon – 如果不是他们强行抛弃Dockerfile并切换到他们自己的格式,这将是一个很好的选择.对于团队中的所有新开发人员而言,这意味着额外的痛苦,因为此工具集需要时间与docker分开学习.
>暂时打包缓存.这只是一个我不确定是否可能的想法.在安装软件包之前以某种方式将软件包管理器缓存(而不是依赖项文件夹)带到计算机,然后将其删除.根据我的hack,它可以显着加快bundler和npm的软件包安装,而不会使机器膨胀不必要的缓存文件.

解决方法

我将gems缓存到应用程序tmp目录中的tar文件.然后,在执行bundle安装之前,使用ADD命令将gem复制到一个层中.从我的Dockerfile.yml:

WORKDIR /home/app

# restore the gem cache. This only runs when
# gemcache.tar.bz2 changes,so usually it takes
# no time
ADD tmp/gemcache.tar.bz2 /var/lib/gems/

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

确保将gem缓存发送到docker机器.我的gemcache是??118MB,但是因为我在本地构建它快速复制.我的.dockerignore:

tmp
!tmp/gemcache.tar.bz2

您需要从构建的图像缓存宝石,但最初您可能没有图像.像这样创建一个空缓存(我在rake任务中有这个):

task :clear_cache do
  sh "tar -jcf tmp/gemcache.tar.bz2 -T /dev/null"
end

构建映像后,将gem复制到gem缓存中.我的图片是带标记的应用.我从映像创建一个docker容器,使用docker cp命令将/var/lib/gems/2.2.0复制到我的gemcache中,然后删除容器.这是我的佣金任务:

task :cache_gems do
  id = `docker create app`.strip
  begin
    sh "docker cp #{id}:/var/lib/gems/2.2.0/ - | bzip2 > tmp/gemcache.tar.bz2"
  ensure
    sh "docker rm -v #{id}"
  end
end

在随后的映像构建中,在调用bundle install之前将gemcache复制到一个层.这需要一些时间,但它比从头开始安装捆绑包更快.

之后构建甚至更快,因为docker缓存了ADD tmp / gemcache.tar.bz2 / var / lib / gems / layer.如果Gemfile.lock有任何更改,则只构建这些更改.

没有理由在每个Gemfile.lock更改时重建gem缓存.一旦缓存和Gemfile.lock之间存在足够的差异,捆绑安装速度很慢,您就可以重建gem缓存.当我想重建gem缓存时,它是一个简单的rake cache_gems命令.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读