我的烧瓶应用程序由四个容器组成: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
答案 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