LoginSignup
8
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-10

背景

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
}
8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9