- Alpine Linux 3.4
- Ruby 2.3.4
- Rails 5.0.3
問題点
docker-compose.ymlの command
に下記を指定して docker-compose up
するとcronを動かしつつRailsサーバを動かすことが出来る。
docker-compose.yml
services:
(略)
command: bash -c "crond && bundle exec rails s -b '0.0.0.0'"
この状態でコンテナのプロセスを確認すると、PID 1で上記のコマンドが動いており、その子プロセスとしてcrondとRailsサーバが動いていることが確認できる。
ここで docker-compose stop
でコンテナを停止しようとする。
docker-compose stop
はPID 1のプロセスにSIGTERMを飛ばすつごう、子プロセスのRailsサーバは特に停止しないので、最終的には強制終了 (Exit 137) されてしまう。
対応
docker-compose.ymlの command
を、exec
でRailsサーバを起動するよう変更する。
docker-compose.yml
services:
(略)
command: bash -c "crond && exec bundle exec rails s -b '0.0.0.0'"
これでPID 1のプロセスがRailsサーバに入れ替わるので、docker-compose stop
でRailsサーバが停止してくれる。
起動用のスクリプトを別途呼び出すようにしている場合でも、最終的に exec bundle exec rails s -b '0.0.0.0'
で起動してあげれば大丈夫。なはず。