Docker コンテナ内のコマンドをホスト側から定期実行する

Dockerコンテナ内のコマンドをホスト側のジョブスケジューリング(cron)で定期実行する。

追記

2021/09追記: supervisordを使うケースについて:

dockerとsupervisordでcronを追加で動かす
docker上で動くdjangoアプリのバッチ処理をsupervisordとcronで行う。 背景 今までにもバッチ処理に関する記事は書いていましたが、今回はdocker+supervisord+cronの組み合わせでdjangoのma...

コンテナが増えてくると、ホスト側での管理が面倒なので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コマンドは使えないので、エラー時はその辺に気をつける。

タイトルとURLをコピーしました