【问题标题】:Gracefully stopping celery in docker container在 docker 容器中优雅地停止芹菜
【发布时间】:2026-01-31 23:00:01
【问题描述】:

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

当我向 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

【问题讨论】:

标签: python docker celery django-celery


【解决方案1】:

docker kill 将杀死容器。您需要做的是将信号仅发送到主要的 celery 进程。

我个人在 docker 容器中使用 supserverd 来管理 celery worker。默认情况下,supervisord 将发送SIGTERM 来停止进程。

这是 celery 的示例主管配置

[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

【讨论】:

  • 啊——是的,我的脑海里有主管会导致同样的结果。主管按预期工作,谢谢。