DockerでRails+Wheneverによるcron実行
cronは cron -f
で動かせるが、環境変数が引き継がれないので期待した動作をしてくれない。少しやり方に悩んだので解決方法をメモ。
Wheneverはenvを記述することでcrontab内に環境変数を定義してくれるのでそれを利用した。結果としては下記のようになった。
ENV.each{|k,v| env k.to_sym, v} 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
している。