2

我在 Docker 中运行 Celery Flower(有关详细信息,请参阅此问题)。该命令最终是:

celery -A proj flower --persistent=True --db=/flower/flower

我已经在/flower. 然而,Flower 似乎从未向其数据库文件写入任何内容,即使在 30 分钟的正常运行时间之后(在此期间处理了大约 120 个任务):

-rw-r--r--  1 user user    0 Mar 11 00:08 flower.bak
-rw-r--r--  1 user user    0 Mar 10 23:29 flower.dat
-rw-r--r--  1 user user    0 Mar 11 00:08 flower.dir

优雅地停止 Docker 容器不起作用,因此 Docker 强行终止它,这意味着最终没有将任何内容写入数据库,因此就好像没有任何内容被持久化。

有没有办法让 Flower 偶尔刷新它的数据库,或者更好的是,优雅地退出?

4

2 回答 2

6

要冲出,您可以设置max_tasks一个合适的数字。

celery -A proj flower --persistent=True --db=/flower/flower --max_tasks=100

这限制了将存储在数据库中的任务数量。一旦达到限制,它将丢弃旧任务。

您可以查看文档以获取更多配置选项。

于 2016-04-23T17:32:29.980 回答
3

Flower 文档中没有详细说明,但在检查代码后,我发现它写回 db 文件的唯一位置是 Flower 优雅停止时。这是最新的代码 (v0.9.2) 1

def stop(self):
    if self.persistent:
        logger.debug("Saving state to '%s'...", self.db)
        state = shelve.open(self.db)
        state['events'] = self.state
        state.close()

这意味着您无法在 Flower 端做任何事情,除非您想更改代码。

但是,在 Docker 端,您可以确保它优雅地关闭容器,以便正确调用docker container stopFlower 的函数。stop()为此,您需要确保您的容器命令使用的是 "exec form" 而不是 "shell form" 2,如文档中所建议的那样。

我还发现了关于另一个服务的类似问题的讨论。如果您需要更详细的解释,请查看那里3


参考:

  1. Github上的花代码
  2. DockerFile CMD 文档
  3. 在 Github 上讨论与 SQL Server Docker 类似的问题
于 2018-03-29T08:56:41.113 回答