docker-compose 和优雅的 Celery 关闭

Posted

技术标签:

【中文标题】docker-compose 和优雅的 Celery 关闭【英文标题】:docker-compose and graceful Celery shutdown 【发布时间】:2017-09-02 17:35:52 【问题描述】:

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

我在使用 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 优雅地关闭?

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

通过docs

Usage: stop [options] [SERVICE...]

Options:
-t, --timeout TIMEOUT      Specify a shutdown timeout in seconds (default: 10).

尝试将超时设置为至少 60 秒。

【讨论】:

似乎不起作用。有趣的是,Celery、Celery Beat 和 Flower 是最先在几秒钟内关闭的东西。 nginx、django、redis 等都花时间并在 60 秒后关闭。还有一个问题:我认为这正是 docker-compose.yml 中的 stop_grace_period 参数的用途?所以运行 bash 命令时不需要设置超时时间。 嗯,是的,但是您只为 celery 服务设置它,在运行docker-compose stop 时设置超时应该适用于所有容器。我不知道为什么它会以这种方式关闭。【参考方案3】:

试试这个:

docker-compose down 

【讨论】:

这里的帖子必须是英文的。这次我为您“翻译”了(无论如何都非常粗略),因为它只是答案的一小部分(其余部分似乎很有用)-但是下次发布答案或问题时请记住这一点就此而言。 尝试更清楚地解释为什么这是问题的答案。

以上是关于docker-compose 和优雅的 Celery 关闭的主要内容,如果未能解决你的问题,请参考以下文章

使用docker部署nginx+tomcat架构:使用docker-compose简化部署操作

Celery框架的基本使用与介绍

云原生之docker-compose篇docker-compose工具的安装和基本使用

Docker-Compose介绍,安装和使用

芹菜任务和xmpp

docker-compose:网络和链接之间的区别