django - docker-compose 和优雅的 celery 关闭

标签 django docker celery docker-compose

我一直想知道并寻找解决方案,但我没有找到任何解决方案。

我在用 docker-compose 构建的容器中运行 Celery。我的容器配置如下:

celery:
  build: .
  container_name: cl01
  env_file: ./config/variables.env
  entrypoint:
    - /celery-entrypoint.sh
  volumes:
    - ./django:/django
  depends_on:
    - web
    - db
    - redis
  stop_grace_period: 1m

我的入口点脚本如下所示:
#!/bin/sh
# Wait for django
sleep 10
su -m dockeruser -c "celery -A myapp worker -l INFO"

现在,如果我运行 docker-compose stop ,我想要一个温暖的(优雅的)关机,给 Celery 提供的 1 分钟( stop_grace_period )来完成已经开始的任务。然而docker-compose stop似乎立即杀死 celery 。 Celery 还应该记录它被要求正常关闭,但除了突然停止我的任务日志之外,我什么也没看到。

我做错了什么或者我需要改变什么才能让 Celery 优雅地关闭?

编辑:
下面关于提供 --timeout 的建议答案docker-compose stop 的参数不能解决我的问题。

最佳答案

您需要标记celery处理 exec ,这样 celery 进程将具有与 docker 命令相同的 ID,docker 将能够向它发送 SIGTERM 信号并优雅地关闭 celery 进程。

# should be the last command in script
exec celery -A myapp worker -l INFO

关于django - docker-compose 和优雅的 celery 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43276342/

相关文章:

python - 如何在 Django 中正确地将查询集链接在一起

django - Django:是否可以在一个通用 View 中验证和保存多种形式的字段?

php - 多个 Nginx + PHP 容器

docker - 无法连接 尝试连接到本地对等点时出错 : context deadline exceeded

python - 仅使用 `T.s([args])` 来调用 Celery 任务是错误的吗?

python - (530, '5.7.0 Must issue a STARTTLS command first. 135sm7372342lfb.28 - gsmtp',你的邮件ID)

python - Django SplitDateTime 小部件抛出 'list' 对象没有属性 'strip'

django - 确定 django-mptt 中每个级别的 "last"元素

angular - 在 Docker 中构建 Angular 项目 - 特定于环境

python - Celery 第一步 - result.get() 超时错误