Posted on: Written by: K-Sato
⚠️ This article was posted over 2 years ago. The information might be outdated. ⚠️

Table of Contents

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 using environment.
  • (2) Set up the named volume bundle_path and add it to the top level volumes.

Here is the modified docker-compose.yml.

version: '3'
services:
  app:
    build: .
    volumes:
      - .:/app
      - bundle_path:/bundle # New
    environment:
      - BUNDLE_PATH=/bundle #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 running containers.
$ docker-compose down
  • (2) Add a new gem and run the command below.
$ docker-compose run app bundle install
  • (3) Run the containers again.
$ docker-compose up

References

About the author

I am a web-developer based somewhere on earth. I primarily code in TypeScript, Go and Ruby at work. React, RoR and Gin are my go-to Frameworks.