COBAKURA.COM

Celeryタスクを更新したときにDockerコンテナを自動リスタートする

docker-composeを使って、Django(webコンテナ)と非同期タスク用にCelery(workerコンテナ)を動かしていました。非同期タスクのコードを変更したときにworkerコンテナをリスタートしないと変更が反映されない問題がありました。

手動でのリスタート

対応前は、いちいち手動でworkerコンテナを再起動させていました。compose.yamlはこんな感じ。

compose.yaml
worker:
    build: .
    working_dir: /code/src
    command: celery -A proj.settings worker -l INFO --concurrency 3

docker compose updocker compose restart worker でworkerコンテナをリスタートして変更を反映していたのですが、毎回これをやるのが面倒でした。

変更時にCeleryタスクを自動リスタート

変更後はこんな感じ。watchdogをインストールする必要があります。

compose.yaml
worker:
    build: .
    working_dir: /code/src
    command: bash -c "python3 -m watchdog.watchmedo auto-restart -d ./ -p '*.py' --recursive -- celery -A proj.settings worker -l INFO --concurrency 3"

watchdogはファイル監視できるライブラリです。-d ./ -p '*.py' --recursive でカレントディレクトリ配下のpythonファイルを監視対象としています。 celery の前の -- はこれ以降がwatchmedoのオプションとして認識されないためのセパレータです。( -A以降がceleryコマンドのオプションとして認識されます。)

これにより、pythonファイルが更新されたときにceleryコマンドが自動で再実行され変更が反映されるようになりました。

おすすめ記事

2023/2/2

WEBサービスを作るときに便利なツール一覧

2023/1/27

Django 特定のフィールドが更新されたかを判定する方法

2023/1/27

Python Social Authで知っておくと便利な仕様