3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dockerでcron動かしつつRailsサーバを動かす

Last updated at Posted at 2017-12-05
  • 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' で起動してあげれば大丈夫。なはず。

参考

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?