python - 在同一个容器中运行 celery worker + beat

标签 python docker flask celery celerybeat

我的 flask 应用由四个容器组成:web 应用、postgres、rabbitMQ 和 Celery。由于我有定期运行的 celery 任务,因此我使用的是 celery beat。我已经像这样配置了我的 docker-compose 文件:

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 从你的 celery 容器中,你会看到多个 celery + beat 进程正在运行(但应该只有一个 beat 进程和许多工作进程)。我从文档中不确定为什么不应该在生产环境中运行 -B 但现在我知道了。

然后我将 Dockerfile.celery 更改为:

# ...code up here...
CMD ["celery", "-A", "app.tasks.celery", "worker", "-l", "INFO"]
CMD ["celery", "-A", "app.tasks.celery", "beat", "-l", "INFO"]

不,当我启动我的应用程序时,工作进程会启动,但 beat 不会。当我翻转这些命令以便首先调用 beat 时,beat 会启动,但工作进程不会。所以我的问题是:如何在容器中同时运行 celery worker + beat?我已经梳理了许多文章/文档,但我仍然无法弄清楚这一点。

已编辑

我将 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

最佳答案

docker 只运行一个 CMD,所以只有第一个 CMD 被执行,解决方法是创建一个 bash 脚本来执行 worker 和 beat,并使用 docker CMD 来执行这个脚本

关于python - 在同一个容器中运行 celery worker + beat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49693148/

相关文章:

c# - python:math.sqrt(x) 函数有多准确?

python - 属性错误: instance has no attribute error in Linux only

Python 3 将 ping 设置为变量返回 0

docker - 重新启动计算机时,docker容器是否被破坏?

docker - 一个Docker容器中的多个Tor服务

python - 带 ID 的 Flask 用户页面

python - 如何使用python将表单数据插入MYSQL

python - 无法从 Qt5 中的 QWheelEvent 获取 pixelDelta

docker - 以编程方式创建 Airflow 池

python - 使用 Flask 发送多个 CSV?