ruby – 更新gem时Docker bundle安装缓存问题
我在开发和生产中都使用了docker,真正让我烦恼的是docker cache simple.我有
ruby应用程序,需要bundle install来安装依赖项,所以我从以下Dockerfile开始:
添加Gemfile Gemfile 所有依赖项都被缓存,并且在我添加新gem之前它很有效.即使我添加的gem只有0.5 MB,从头开始安装所有应用程序宝石仍需要10-15分钟.然后由于依赖项文件夹的大小(约300MB)再部署10分钟. 我遇到了与node_modules和npm完全相同的问题.我在想,有没有人找到解决这个问题的方法? 我的研究结果到目前为止: > Source to image – 跨增量构建缓存任意文件.不幸的是,由于它的工作方式,它需要将整个300MB推送到注册表,即使宝石没有改变.更快的构建 – >即使未更新宝石,也会降低部署速度. 解决方法
我将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命令. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |