ヨージとプログラミング

プログラミング勉強の記録

【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