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 up
や docker 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コマンドが自動で再実行され変更が反映されるようになりました。