背景
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
で一貫すればいいと思う。
以下のように dr
と de
を用意しておくと便利かも。
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
}