在相同的容器中运行芹菜工人+节拍

时间:2018-04-06 12:45:58

标签: python docker flask celery celerybeat

我的烧瓶应用程序由四个容器组成:web app,postgres,rabbitMQ和Celery。由于我有定期运行的芹菜任务,我正在使用芹菜打败。我已经配置了这样的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,你会看到多个芹菜+节拍过程在运行(但是应该只有一个节拍过程和许多工人过程)。我不能从文档中确定为什么你不应该在生产中运行-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会启动,但是worker is不会。所以我的问题是:如何在我的容器中运行芹菜工人+一起拍?我已经梳理了很多文章/文档,但我仍然无法解决这个问题。

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

不能说它是否已准备就绪,但它对我来说就像一个魅力(用document/document/Test15.jpg键)

答案 2 :(得分:0)

我如上所述插入入口点,然后加上&>将输出保存在日志文件中。

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