Docker: ¿Debo rebuild el contenedor desde cero cada vez que necesito agregar software?

Así que estoy experimentando con Docker, y configuré una aplicación de Rails hablando con postgres. Todo funciona, puedo acceder a la aplicación, migrar la database, etc.

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" 

Después de hacer un par de models y un controller, decidí usar templates Slim para el proyecto y lo agregué a mi Gemfile

 gem 'slim' 

Esperaría poder actualizar esta dependencia en el contenedor web ejecutando bundle install en él:

 docker-compose run web bundle install 

Lo que parece funcionar al principio, instala la gem y sus dependencies. Sin embargo, estos solo están en una copy desechable del contenedor construido. No se queda cuando ejecuto docker-componen la próxima vez.

La única forma de get la gem de forma permanente es volver a build la web desde cero, lo que puede llevar de 3 a 4 minutos instalar de nuevo todas las gems, principalmente debido a nokigiri.

¿Es esta la única forma de "actualizar" una image base? Esperaría que solo necesitaría rebuild si estoy modificando el file Dockerfile, cuando tendría sentido rebuild desde cero.

Si lo desea, también puede actualizar una image existente "confirmando" los cambios que ha realizado en un contenedor. La syntax es docker commit <container ID> <image> .

Alternativamente, puede aprovechar la memory caching de compilation, separando su command de installation del package en instalaciones gemelas individuales. Luego puede agregar su nueva gem hasta el final y reutilizará todas las capas anteriores cuando reconstruya la image. Esto puede no ser ideal teniendo en count que puede haber dependencies superpuestas.