私のフラスコアプリは4つの容器で構成されています: ウェブアプリケーション、ポストグル、ウサギMQとセロリ。定期的に実行されるセロリのタスクがあるので、私はセロリのビートを使用しています。私は次のように私のドッカーの作成ファイルを設定しました:
version: "2"
services:
rabbit:
# ...
web:
# ...
rabbit:
# ...
celery:
build:
context: .
dockerfile: Dockerfile.celery
そして私のDockerfile.celeryは次のようになります:
# ...code up here...
CMD ["celery", "-A", "app.tasks.celery", "worker", "-B", "-l", "INFO"]
私はドキュメントで、私が生産に行くべきではないことを読んでいる間、 -B
私は急いでそれを追加し(そしてそれを忘れてしまった)、スケジュールされたタスクが複数回実行されていることをすぐに知った。興味のある人のために、あなたが ps aux | grep celery
あなたのセロリの容器の中から、あなたは見るでしょう複数のセロリ+ビートプロセスが実行されます(しかし、ビートプロセスは1つだけでなく、多くのワーカープロセスが必要です)。私はドキュメントからなぜあなたが走ってはいけないのか分からなかった -B
生産ではなく、今私は知っている。
だから私はDockerfile.celeryを次のように変更しました:
# ...code up here...
CMD ["celery", "-A", "app.tasks.celery", "worker", "-l", "INFO"]
CMD ["celery", "-A", "app.tasks.celery", "beat", "-l", "INFO"]
いいえ私は私のアプリを起動すると、ワーカープロセスビートはありません。これらのコマンドを前後に動かすと、ビートが最初に呼び出され、ビートが始まりますが、ワーカープロセスは実行されません。だから私の質問は:私はどのように私のコンテナでセロリの労働者+ビートを実行するのですか?私は多くの記事/文書を梳きましたが、私はまだこれを理解することができません。
EDITED
Dockerfile.celeryを次のように変更しました:
ENTRYPOINT [ "/bin/sh" ]
CMD [ "./docker.celery.sh" ]
そして私のdocker.celery.shファイルは次のようになります:
#!/bin/sh -ex
celery -A app.tasks.celery beat -l debug &
celery -A app.tasks.celery worker -l info &
しかし、私はエラーを受け取りました celery_1 exited with code 0
編集#2
私は私のdocker.celery.shファイルの最後に以下のブロッキングコマンドを追加し、すべてが修正されました:
tail -f /dev/null
回答:
回答№1は2ドッカーはCMDを1つだけ実行するので、最初のCMDだけが実行されます。回避策は、ワーカーとビートの両方を実行するbashスクリプトを作成し、ドッカーCMDを使用してこのスクリプトを実行することです
回答№2の場合は0
あなたは使うことができます セロリbeatX ビートのために。複数のbeatXインスタンスを持つことができます(お勧めします)。ロックを使用して同期を行います。
それは生産準備ができていると言うことはできませんが、それは私のために魅力のように動作します( -B
キー)