繁体   English   中英

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

[英]Running celery worker + beat in the same container

我的烧瓶应用程序由四个容器组成: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 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 来执行这个脚本

如上所述,我通过输入入口点来获得,另外我添加了 &> 以将输出保存在日志文件中。

我的 entrypoint.sh

#!/bin/bash
python3 manage.py migrate

python3 manage.py migrate catalog --database=catalog

python manage.py collectstatic --clear --noinput --verbosity 0


# Start Celery Workers
celery worker --workdir /app --app dri -l info &> /log/celery.log  &

# Start Celery Beat
celery worker --workdir /app --app dri -l info --beat &> /log/celery_beat.log  &

python3 manage.py runserver 0.0.0.0:8000

您可以使用celery beatX进行节拍。 允许(并建议)拥有多个 beatX 实例。 他们使用锁来同步。

不能说它是否可以生产,但它对我来说就像一个魅力(使用-B键)

从@shahaf强调的相同概念开始,我以这种方式使用bash -c从另一个解决方案开始解决:

command: bash -c "celery -A app.tasks.celery beat & celery -A app.tasks.celery worker --loglevel=debug"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM