使用docker时避免双包安装

我使用泊坞窗作为我的开发环境与我的rails应用程序与以下docker-compose.yml

 app: build: . ports: - "3000:3000" links: - db - mail volumes: - .:/usr/src/app - gemrc:/etc/gemrc db: image: mdillon/postgis ports: - "5432:5432" environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=database volumes: - ./docker/pgdata:/var/lib/postgresql/data mail: image: djfarrelly/maildev ports: - "1080:80" 

和我的Dockerfile

 FROM rails:onbuild 

当我需要添加一个新的gem到我的Gemfile时,我必须先生成我的Gemfile.lock

 docker run --rm -v gemrc:/etc/gemrc -v /home/user/project:/usr/src/app -w /usr/src/app ruby bundle install 

并重builddocker的形象:

 docker-compose build docker-compose up 

因此,我必须运行bundle install两次,而不能添加 – 没有--without development test标志。 为了更快地做到这一点,我gemrc它添加到我的gemrc文件中:

 gem: --no-document 

有没有办法避免双bundle install

也许你可能想尝试下面的docker-compose 开发环境工作stream程。

  1. 与database.yml类似,我们的docker-compose.yml不包含在我们的CVS(git)中,为开发人员自定义configuration提供类似的好处。

  2. 在启动应用程序容器之前在本地构build您的图像,并将其标记为foo_app:latest 。 这是有道理的,因为你在开发。 只要执行docker build . 在你的应用的根目录下,假设你的Dockefile在这个目录下。

  3. 为捆绑包定义数据卷容器并将其安装到应用程序容器中。 您的docker-compose.yml可能如下所示:

 app: image: foo_app ports: - "3000:3000" links: - db - mail volumes: - .:/usr/src/app volumes_from: - bundle bundle: image: foo_app:latest volumes: - /home/app/bundle db: image: mdillon/postgis ports: - "5432:5432" environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=database volumes: - ./docker/pgdata:/var/lib/postgresql/data mail: image: djfarrelly/maildev ports: - "1080:80" 
  1. 每当你需要添加一个新的gem,只需将其添加到您的Gemfile,并执行bundle install在您的应用程序容器。 例如,如果您的应用程序容器的名称是foo_app_1

    docker exec foo_app_1 bundle install

    数据量容器将始终具有应用程序的最新/边缘快照

  2. 为您的发行版添加标签,并在可供您的演出/制作/团队访问的中央存储库中构build“正式版本映像”。

有了这种方法,每次你开始/重新创build你的应用程序容器时,你所有的gem就像上一次更新它们一样。 您也可以将此方法用于其他types的数据,您希望在容器生命周期中保持其他types的数据,添加“组件”以pipe理无状态应用程序中的状态。

有关更多信息,请参见https://docs.docker.com/engine/userguide/containers/dockervolumes/