miyasakura’s diary

日記です。

DockerでRails+Wheneverによるcron実行

cronは cron -f で動かせるが、環境変数が引き継がれないので期待した動作をしてくれない。少しやり方に悩んだので解決方法をメモ。

Wheneverはenvを記述することでcrontab内に環境変数を定義してくれるのでそれを利用した。結果としては下記のようになった。

env :BUNDLE_PATH, ENV['BUNDLE_PATH']
env :BUNDLE_APP_CONFIG, ENV['BUNDLE_APP_CONFIG']
env :HOGE, ENV['HOGE']
# 他にも外部サービスの API_KEY とか色々

every 2.minutes do
  rake 'something:do'
end
#!/bin/bash

bundle exec whenever --update-crontab

LOG_FILE=$(dirname $0)/../log/production.log

touch ${LOG_FILE}
cron && tail -f ${LOG_FILE}

Dockerfileは通常通り作成し、cronを実行するコンテナとして動かすときだけ明示的にコマンドを指定する。

docker run -d <image> docker/cron.sh

以上でコンテナ実行時の環境変数をcronに渡すことができる。実行ログについてはDockerなので標準出力に出すようにした。Rails側で標準出力してもcronがそれを出力してくれるわけではないので、ファイルに出力したものを明示的にtail -fしている。