Dockerコンテナ内のコマンドをホスト側のジョブスケジューリング(cron)で定期実行する。
追記
2021/09追記: supervisordを使うケースについて:

dockerとsupervisordでcronを追加で動かす
docker上で動くdjangoアプリのバッチ処理をsupervisordとcronで行う。背景今までにもバッチ処理に関する記事は書いていましたが、今回はdocker+supervisord+cronの組み合わせでdjangoのmanage...
コンテナが増えてくると、ホスト側での管理が面倒なので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コマンドは使えないので、エラー時はその辺に気をつける。


コメント