在Docker上进行ruby捆绑优化

我是新来的docker工人,想知道如何重新build立docker图像ruby捆绑机的行为? 我第一次构build映像时,需要永久bundle install 。 当我在Gemfile中添加另一个gem时会发生什么? 有没有办法确保以前的gem在图像中以某种方式被caching,并用于这个新的捆绑?

Dockerfile:

 FROM rails:onbuild RUN apt-get install -y imagemagick 

这取决于你如何ADD你的Gemfile。

 ADD Gemfile /var/www/yourapp/ ADD Gemfile.lock /var/www/yourapp/ RUN bundle install 

在这种情况下,只有在GemfileGemfile.lock更改的情况下, bundle install才会运行。 请注意,将此指令放置在Dockerfile中很重要。 只要先前的构build步骤caching失效,所有后续的指令都不再被caching。 (比如你在Gemfile之前ADD一个configuration文件,并且更改 – > bundle安装将会运行)。

当我在Gemfile中添加另一个gem时会发生什么?

如果你只是想添加一些gem,而不捆绑一切,你也可以做一些事情:

 ADD Gemfile /var/www/yourapp/ ADD Gemfile.lock /var/www/yourapp/ RUN bundle install ... ADD Gemfile.tip /var/www/yourapp/ RUN bundle install 

这里是一个可以检出的rails示例项目(有详细logging)。