Introduction
Let's suppose you have a docker-compose.yml
like the one below.
You have to run docker-compose build
every time you add/remove a gem to/from your Gemfile
and it is very time-consuming.
It would be great if I could just run bundle install
and get back to developing the application.
Well... I'll show you exactly that in this post.
version: "3"
services:
app:
build: .
volumes:
- .:/app
depends_on:
- postgres
postgres:
image: postgres
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Set up your docker-compose.yml
Follow the steps below.
- (1) Set up
BUNDLE_PATH
usingenvironment
. - (2) Set up the named volume
bundle_path
and add it to the top levelvolumes
.
Here is the modified docker-compose.yml
.
version: "3"
services:
app:
build: .
volumes:
- .:/app
- bundle_path:/bundle # New
environment:
- BUNDLE_PATH=/bundle/vendor #New
depends_on:
- postgres
postgres:
image: postgres
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
bundle_path: # New
postgres-data:
How to use it?
Create the cache of the gems
Run the command below to create the cache of the gems after you modified your docker-compose.yml
.
$ docker-compose app bundle install
Add or Remove a gem
- (1) Stop the running containers.
$ docker-compose down
- (2) Add a new gem and run the command below.
$ docker-compose run app bundle install
- (3) Get the containers running again.
$ docker-compose up
Top comments (3)
There must be a typo on first command .
Maybe you meant
Thanks for the good work.
Will this setup also work with Rails devcontainers?
Very helpful thanks, remember to chmod that directory if you are running the container as a non-root user!