やりたいこと
- cronを使ってRailsのRakeタスクを動かしたい
- crontabにはRailsのwheneverを使って設定したい
- Docker環境で動かしたい
productionで使う予定はないので雑に解決してしまったが、ひとまず動いた方法をメモする
解決策概要
- Dockerfileでcronをインストール
- Dockerfile上で
whenever --update-crontab
する - cronをフォアグラウンドで動作させる
- Dockerだとcron動かない問題解消のため
- wheneverによるcron設定時に環境変数を渡す
- cronから環境変数が見えなくてrakeが動かない問題解消のため
結果
各種ファイルはこんな感じ
# Dockerfile
FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y build-essential
RUN apt-get install -y cron # cronインストール
RUN mkdir /app-name
WORKDIR /app-name
ADD Gemfile /app-name/Gemfile
ADD Gemfile.lock /app-name/Gemfile.lock
RUN bundle install
ADD . /app-name
RUN bundle exec whenever --update-crontab # wheneverでcrontab書き込み
CMD ["cron", "-f"] # cronをフォアグラウンド実行
config/schedule.rb
ENV.each { |k, v| env(k, v) } # 環境変数をwheneverにいい感じに書き込んでもらう
set :output, error: 'log/crontab_error.log', standard: 'log/crontab.log' # ログを書き出すようにしておくとデバッグが楽
set :environment, :development
every 1.minute do
rake "task:name"
end
docker-compose.yml
version: "3"
services:
app:
build: .
container_name: app-name
ports:
- "3000:3000"
tty: true
db:
# 他コンテナの記載は省略
その他
- デバッグ時は立ち上げたコンテナに
docker exec -it app-name bash
とかでアタッチしてがんばる-
crontab -l
でcrontabに書き込まれたか確認 - catコマンドで
config/schedule.rb
で設定したログファイル確認
-