Docker
コンテナ内のコマンドをホスト側のジョブスケジューリング(cron
)で定期実行する。
追記
2021/09追記: supervisord
を使うケースについて:
dockerとsupervisordでcronを追加で動かす
docker上で動くdjangoアプリのバッチ処理をsupervisordとcronで行う。 背景 今までにもバッチ処理に関する記事は書いていましたが、今回はdocker+supervisord+cronの組み合わせでdjangoのmana...
コンテナが増えてくると、ホスト側での管理が面倒なのでsupervisord
を使ってひとまとめのコンテナにするのがいいと思います。
本文
cron
用のコンテナを立てる方法もあるようだが、設定が面倒なのでホストのcron
を使う。
docker-compose
のサービスwebapp
(Djangoアプリ)内のコマンドを実行させる。
なお、ホスト1台のみでクラスタリングはしないのでサービスで起動されるコンテナは1つ。
ホスト側で実行中のコンテナでコマンドを実行するときは、docker exec <CONTAINER_ID or CONTAINER_NAME> command
を使う。
また、docker-compose
で起動中のコンテナ名は次のようになっていることから(docker ps
で確認可能):
<DIR_NAME>_webapp_1_<hash>
ホスト側のシェルから、以下のコマンドでコンテナ内のコマンドが実行できる:
docker exec $(docker ps | grep <DIR_NAME>_webapp | awk '{print $1}') python <PROJECT_NAME>/manage.py some_command
あとはこれを/etc/crontab
などに登録しておけばいい。この方法だとコンテナが2つあると動かないと思う(備忘)。
また、実行ユーザーがdocker
グループに所属しているか、rootユーザーでないと大体の場合docker
コマンドは使えないので、エラー時はその辺に気をつける。
コメント