【Rails】Dockerなジョブスケジューラーはwheneverよりcronoがいい
ほとんど検証してない上に独断と偏見ばっかです
TL;DR
- Dockerにcronをインストールしてやる方法はうまく動かなかった(調査中)
- そもそもcronに依存するスケジューラーは使い勝手悪い
- cronに依存しないジョブスケジューラーを選定すべき(cronoとか)
cronに依存するwheneverはdockerでは使いにくい
「rails ジョブスケジューラー」で検索するとwheneverというgemを使う方法がいの一番に来ていますが、dockerではなぜかうまく行かなかった。
具体的にはdocker-composeでcronをスタートできなかった
# docker-compose一部抜粋 command: bash -c "crond -f && bundle exec rails s -b 0.0.0.0"
docker-compose up
で上記のコマンドが動いてほしいわけですが、この時cornd -f
でcronは起動しますが、rails s
の方は動きません(というかhttp://localhost:3000が表示されないのでそう判断してます)。
いろいろ解決方法を探りましたが、cron専用のコンテナを作ったり、delayed_job_active_recordというバックグラウンドジョブを扱うgemを入れたりがあるようですが、、、個人的にはこれらは複雑になりすぎてる気がしました。
(参考)
Add background jobs and cron to your dockerized ruby on rails app
cronoはcron操作がなく、バックグラウンドで動かせる
cronoというgemはジョブスケジューラーですが、wheneverではあった、whenever --update-corntab
のような更新作業はありません。
daemons
というgemを入れることでバックグラウンドで動かせます。
cronをdockerにインストールする必要もありません。(多分。alpine環境なので未検証)
最終的にdocker-compose up
で作動するコマンドは次のようになりました
command: bash -c "bundle exec crono start && bundle exec rails s -b 0.0.0.0"
これでcronoとrails serverの両方を起動することができました。
(参考)
Ruby On Railsで、cronoを使って最小手順でバッチ処理を作る
補足
cronに依存しないジョブスケジューラーはまだまだあるようで、こちらのブログでいろいろ紹介してくださっております。自分に合うものを見つけよう tech.medpeer.co.jp