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

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

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をコピーしました