背景
docker-composeを使って開発しているが、Gemを更新する度にdocker buildをするのは辛いしだるい。
ゴールはGemの更新の度にこれが出来れば良い。
$ docker-compose run --rm rails bundle install
ちなみに、現状のDockerfileはこんな感じ。
FROM ruby:2.3.4
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN apt-get install -y qt5-default qt5-qmake libqt5webkit5-dev gstreamer1.0-plugins-base gstreamer1.0-tools gstreamer1.0-x
RUN mkdir /rails
WORKDIR /rails
ADD Gemfile /rails/Gemfile
ADD Gemfile.lock /rails/Gemfile.lock
RUN bundle install
ADD . /rails
解決策
bundlerによって配備されるディレクトリをdocker-composeが提供するボリュームに入れてあげれば良い。
まずは、現状のdocker-compose.ymlから。
version: '2'
services:
db:
image: mysql:5.7
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
volumes:
- sql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- 3306
rails:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/rails
ports:
- "3000:3000"
environment:
RAILS_ENV: development
RAILS_DATABASE_NAME: hoge
RAILS_DATABASE_USER: root
RAILS_DATABASE_PASSWORD: password
RAILS_DATABASE_HOST: db
tty: true
stdin_open: true
links:
- db
volumes:
sql-data:
driver: local
bundler用のボリュームを追加。
$ diff old.yml new.yml
diff --git a/old.yml b/new.yml
index 546cb42..22d618b 100644
--- a/old.yml
+++ b/new.yml
@@ -14,6 +14,7 @@ services:
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/rails
+ - bundle:/bundle
ports:
- "3000:3000"
environment:
@@ -29,3 +30,5 @@ services:
volumes:
sql-data:
driver: local
+ bundle:
+ driver: local
これで、Gemの更新の度にdocker buildをせずにdocker-compose run --rm rails bundle install
が実行出来てストレスが軽減出来るネー。