在docker集装箱中优雅地停止芹菜

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

当我发送TERM正在运行的进程:

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

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

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

任何想法为什么这可能会发生? 信号是否终止了容器以及芹菜过程?

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

docker kill将杀死容器。 你需要做的是只发送信号到主芹菜进程。

我个人使用docker集装箱内的supservisordpipe理芹菜工人。 默认情况下,supervisord会发送SIGTERM来停止进程。

这里是一个芹菜示例主pipeconfiguration

 [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