Docker:我需要在需要添加软件时从头开始重建容器吗?

时间:2015-04-15 02:08:23

标签: ruby docker bundler docker-compose

所以我正在试验Docker,并设置了一个与postgres交谈的Rails应用程序。一切正常,我能够访问应用程序,迁移数据库等等。

Dockerfile
FROM ruby:2.2.1

RUN apt-get update -qq && apt-get install -y build-essential
RUN apt-get install -y libxml2-dev libxslt1-dev
RUN apt-get install -y libqt4-webkit libqt4-dev xvfb
RUN apt-get install -y nodejs

ENV APP_HOME /code
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

ADD . $APP_HOME
RUN bundle install

docker-compose.yml
web:
  build: .
  command: bin/rails server --port 3000 --binding 0.0.0.0
  ports:
   - "3000:3000"
  volumes:
   - .:/code
  links:
   - db
db:
  image: postgres
  ports:
    - "5432:5432"

在制作了几个模型和控制器之后,我决定为项目使用Slim模板并将其添加到我的Gemfile中

gem 'slim'

我希望能够通过在其上运行bundle install来更新Web容器上的这种依赖关系:

docker-compose run web bundle install

一开始似乎起作用,它会安装gem及其依赖项。然而,这些仅仅是建造容器的丢失副本。当我下次运行docker-compose时,它并没有留下来。

永久获取宝石的唯一方法是再次从头开始构建网页,这可能需要3-4分钟从头开始安装所有宝石,主要是由于nokigiri。

这是"更新"基本形象?我希望我只需要重建,如果我修改Dockerfile本身,那么从头开始重建是有意义的。

1 个答案:

答案 0 :(得分:4)

如果需要,您还可以通过&#34;提交&#34;来更新现有图像。您对容器所做的更改。语法为docker commit <container ID> <image>

或者,您可以通过将bundle install命令分成单独的gem安装来利用构建缓存。然后,您可以将新的gem添加到最后,并在重建图像时重用所有以前的图层。考虑到可能存在重叠的依赖关系,这可能并不理想。