Docker:当我需要添加软件时,是否需要重新构build容器?

所以我正在试验Docker,我build立了一个Rails应用程序与postgres交谈。 一切正常,我可以访问应用程序,迁移数据库等

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安装来更新web容器的依赖关系:

 docker-compose run web bundle install 

这看起来工作起初,它安装了gem和它的依赖。 但是,这些只是在build立的容器的一个丢弃副本。 下次运行docker-comp时,IT不会停留在周围。

永久获得gem的唯一方法是再次从头开始构buildnetworking,这可能需要3-4分钟才能从头开始重新安装所有的gem,主要是由于nokigiri。

这是“更新”基本图像的唯一方法吗? 我希望我只需要重build,如果我修改Dockerfile本身,什么时候从头开始重build是有意义的。

如果你愿意,你也可以通过“提交”你对容器所做的更改来更新现有的图像。 语法是docker commit <container ID> <image>

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