优雅地停泊在码头工人容器中的芹菜

时间:2016-02-01 22:33:36

标签: python docker celery django-celery

我有一个芹菜运行在docker容器中处理来自rabbitmq的任务。我试图停止并删除芹菜容器,同时允许当前运行的任务完成。文档建议将TERM或INT信号发送到主进程应该会关闭芹菜,尽管我发现子进程正在被杀死。

当我向TERM发送它抛出的正在运行的进程时:

WorkerLostError('Worker exited prematurely: signal 15 (SIGTERM).',)

当我发送INT时,正在运行的进程只是退出而没有错误,尽管它也不允许任务按照文档的建议完成。

我使用以下命令启动docker容器: su -m celery_user -c "python manage.py celery worker -Q queue-name"

有关为何会发生这种情况的任何想法?是不是信号终止了容器以及芹菜过程?

我正在发送信号: docker kill --signal="TERM" containeriddocker exec containerid kill -15 1

1 个答案:

答案 0 :(得分:1)

docker kill会杀死容器。您需要做的是仅将信号发送到主芹菜过程。

我个人在docker容器内使用supservisord来管理芹菜工人。默认情况下,supervisord将发送SIGTERM以停止该过程。

这是芹菜的示例主管配置

[program:celery]
command=celery worker -A my.proj.tasks --loglevel=DEBUG -Ofair --hostname celery.host.domain.com --queues=celery
environment=PYTHONPATH=/etc/foo/celeryconfig:/bar/Source,PATH=/foo/custom/bin:/usr/kerberos/bin
user=celery-user
autostart=true
stdout_logfile=/var/log/supervisor/celery.log
redirect_stderr=true