优雅地停止 docker 容器中的芹菜
Gracefully stopping celery in docker container
我在 docker 容器中有 celery 运行 处理来自 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" containerid
或 docker exec containerid kill -15 1
docker kill
将杀死容器。您需要做的是仅将信号发送到主芹菜进程。
我个人使用 docker 容器内的 supservisord 来管理 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
我在 docker 容器中有 celery 运行 处理来自 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" containerid
或 docker exec containerid kill -15 1
docker kill
将杀死容器。您需要做的是仅将信号发送到主芹菜进程。
我个人使用 docker 容器内的 supservisord 来管理 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