Rails のローカル開発環境を heroku-docker の Dockerfile + docker-compose で

  • 8
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

背景

heroku-docker のままだと、変更があるたび heroku docker:start しないといけなくてめんどくさい。
また、heroku docker:exec では rails g migration などファイル変更を伴うコマンドの恩恵を得られない。

そこで、Dockerfile 自体は heroku docker:init で吐かれたものを使いつつも、開発用にコードを mount したりする docker-compose.yml を用意し、適時コンテナ上で docker exec するようにしてみた。
また、rails のコンテナがダミーコマンドで起動したままにすることで、spring の恩恵も得られるようにしている。

ファイル

Dockerfile

heroku docker:init したまま。

docker-compose.yml

dbdata:
  image: postgres
  command: true
  volumes:
  - /var/lib/postgresql/data

db:
  image: postgres
  volumes_from:
   - dbdata
  ports:
  - 5432:5432

gemdata:
  build: .
  volumes:
  - /app/heroku/bundler

web:
  build: .
  command: watch echo # ダミーコマンドで web container を起動したままにする
  ports:
   - 8080:3000
  environment:
    PATH: /app/src/bin:/app/heroku/node/bin:/app/heroku/bundler/bin:/app/heroku/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # ./bin にパスを通したい
    GEM_HOME: /app/heroku/bundler
    TERM: xterm # rails console などで色をつけるため
  links:
  - db
  volumes:
  - $PWD:/app/src
  volumes_from:
  - gemdata

使い方

docker-compose up
docker exec -it hogehoge_web_1 bundle install
docker exec -it hogehoge_web_1 rails s -b 0.0.0.0

docker exec -it hogehoge_web_1 というのをコマンド前につけることになる。
spring いらないなら、docker-compose run で一貫すればいいと思う。

以下のように drde を用意しておくと便利かも。

alias dr='docker-compose run web'
function de() {
  local image_name=$(basename $PWD | sed -e 's/\-//')_web
  local container_id=$(docker ps -f name=$image_name -f status=running -l -q)
  if [ -n "$container_id" ]; then
    docker exec -it $container_id $@
  else
    echo "$image_name is not running" 1>&2
    return 1
  fi
}