概要
以下のようなスタンダードなdocker-compose.yml
が存在するとします。
このままではgemを追加する度にdocker-compose build
をする必要があり、build
の度にかなりの時間がかかります。これは、buildの度にgemファイルを一からインストールし直すためです。
そこで、gemを追加する際に追加したgemのみインストールする方法を紹介します。
docker-compose.yml
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:
設定
以下の手順で対応を行います。
- (1)
environment
を使用し、BUNDLE_PATH
を設定。 - (2) 名前付きvolumeの
bundle_path
を設定し、トップレベルのvolumes
に追加します。
実際に書き換えたdocker-compose.yml
は以下のようになります。
docker-compose.yml
version: "3"
services:
app:
build: .
volumes:
- .:/app
- bundle_path:/bundle # 追加箇所
environment:
- BUNDLE_PATH=/bundle # 追加箇所
depends_on:
- postgres
postgres:
image: postgres
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
bundle_path: # 追加箇所
postgres-data:
使用方法
gemのcache作成
docker-compose.yml
を以下のように変更したらgemのキャッシュを作成する為に以下のコマンドを実行します。
$ docker-compose app bundle install
新しいgemの追加
- (1) 使用しているコンテナがあれば停止します。
$ docker-compose down
- (2) gemをGemfileに追加し、インストールします。(新たに追加されたgemの更新のみ実行されます。)
$ docker-compose run app bundle install
- (3) 再びコンテナを立ち上げます。
$ docker-compose up
以上でgemを追加する度にdocker-compose build
を実行する必要がなく、より効率的に開発を行うことができます。