我使用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
当我需要为我的Gemfile添加一个新的gem时,我必须首先生成我的Gemfile.lock
:
docker run --rm -v gemrc:/etc/gemrc -v /home/user/project:/usr/src/app -w /usr/src/app ruby bundle install
重建码头图像:
docker-compose build
docker-compose up
因此,我必须运行bundle install
两次,而无法添加--without development test
标志。为了更快地将其添加到我的gemrc
文件中:
gem: --no-document
但有没有办法避免双bundle install
?
答案 0 :(得分:1)
也许您可能想为开发环境尝试以下docker-compose工作流程。
与database.yml类似,我们的docker-compose.yml未包含在我们的CVS(git)中,为开发人员自定义配置提供了类似的好处。
在启动应用容器之前在本地构建映像,并将其标记为 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并在app容器中执行bundle install
即可。例如,如果您的应用容器的名称是 foo_app_1 :
docker exec foo_app_1 bundle install
数据卷容器将始终包含应用程序宝石的最新/边缘快照。
标记您的版本并构建"官方发布图像"在您的登台/制作/团队可访问的中央存储库中。
每次启动/重新创建应用容器时都会采用这种方法,所有的宝石都与上次更新时一样。您还可以将此方法用于您希望在容器生命周期中持久化的其他类型的数据,添加"组件"管理无状态应用程序中的状态。
有关详细信息,请参阅https://docs.docker.com/engine/userguide/containers/dockervolumes/