使用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程。
-
与database.yml类似,我们的docker-compose.yml不包含在我们的CVS(git)中,为开发人员自定义configuration提供类似的好处。
-
在启动应用程序容器之前在本地构build您的图像,并将其标记为foo_app:latest 。 这是有道理的,因为你在开发。 只要执行
docker build .
在你的应用的根目录下,假设你的Dockefile在这个目录下。 -
为捆绑包定义数据卷容器并将其安装到应用程序容器中。 您的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"
-
每当你需要添加一个新的gem,只需将其添加到您的Gemfile,并执行
bundle install
在您的应用程序容器。 例如,如果您的应用程序容器的名称是foo_app_1 :docker exec foo_app_1 bundle install
数据量容器将始终具有应用程序的最新/边缘快照 。
-
为您的发行版添加标签,并在可供您的演出/制作/团队访问的中央存储库中构build“正式版本映像”。
有了这种方法,每次你开始/重新创build你的应用程序容器时,你所有的gem就像上一次更新它们一样。 您也可以将此方法用于其他types的数据,您希望在容器生命周期中保持其他types的数据,添加“组件”以pipe理无状态应用程序中的状态。
有关更多信息,请参见https://docs.docker.com/engine/userguide/containers/dockervolumes/