芹菜;RabbitMQ作为docker容器运行:接收到类型为“…”的未注册任务

我对docker、芹菜和兔子比较陌生

在我们的项目中,我们目前有以下设置:
1台运行多个docker容器的物理主机:

1x rabbitmq:3-管理容器

#从docker hub中提取映像并安装
docker pull rabbitmq:3-management
#运行docker映像
docker run-d-e RABBITMQ_NODENAME=我的兔子--说出一些兔子的名字-p 8080:15672-p 5672:5672 RABBITMQ:3-management

1x芹菜容器

#从docker hub中提取docker映像
多克勒芹菜
#干芹菜容器
docker run--链接一些兔子:兔子--命名一些芹菜-d芹菜

(还有一些容器,但它们不应该与问题有任何关系)

任务文件

为了了解Cellery和rabbitmq,我在物理主机上创建了一个tasks.py文件:

从芹菜进口芹菜
app=芹菜('tasks',backend='amqp',broker='amqp'amqp://guest:[email protected]/')
@app.task(name='tasks.add')
def添加(x,y):
返回x+y

实际上,整个设置似乎运行得很好。因此,当我在tasks.py所在的目录中打开python shell并运行时

&gt&燃气轮机&燃气轮机;从任务导入添加
&燃气轮机&燃气轮机&燃气轮机;添加延迟(4,4)

该任务排队并直接从芹菜工人那里提取

但是,芹菜工人不知道有关日志的任务模块:

$docker记录了一些芹菜
[2015-04-08 11:25:24669:ERROR/MainProcess]收到类型为“tasks.add”的未注册任务。
该消息已被忽略和丢弃。
您是否记得导入包含此任务的模块?
或者您使用的是相对导入?
请看http://bit.ly/gLye1c 了解更多信息。
邮件正文的全部内容为:
{'callbacks':None,'timelimit':(None,None),'retries':0,'id':'2b5dc209-3c41-4a8d-8efe-ed450d537e56','args':(4,4),'eta':None,'utc':True,'taskset':None,'task':'tasks.add,'errbacks':None,'kwargs':{},'chord':None,'expires':None}(256b)
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.4/site packages/芹菜/worker/consumer.py”,第455行,在收到的on_任务中
策略[名称](消息、正文、,
KeyError:“任务。添加”

所以问题显然是芹菜容器中的芹菜工人不知道tasks模块。
现在,由于我不是docker专家,我想问一下如何最好地将tasks模块导入芹菜容器

感谢您的帮助:)


编辑2015年4月8日21:05:

谢谢伊索文的回答。为了完整起见,以下是我所做的:

让我们假设我的任务.py位于我的本地机器上/home/platzhersh/celerystuff。现在,我在同一个目录中创建了一个包含以下内容的celeryconfig.py

西芹导入=(“任务”)
芹菜\u忽略\u结果=错误
芹菜\结果\后端=’amqp’

正如Isowen所提到的,芹菜在容器的/home/user中搜索任务和配置文件。因此,我们在启动时将/home/platzhersh/celerystuff装入容器:

run-v/home/platzhersh/cellerystuff:/home/user--链接一些兔子:兔子--命名一些芹菜-d芹菜

这对我起了作用。希望这能帮助其他有类似问题的人。
现在,我将尝试通过将任务也放在单独的docker容器中来扩展该解决方案

正如您所怀疑的,问题是因为芹菜工人不知道tasks模块。您需要做两件事:

  1. 将任务定义“放入”docker容器
  2. 配置芹菜工作者以加载这些任务定义

对于第(1)项,最简单的方法可能是使用“Docker卷”将代码的主机目录装载到芹菜Docker实例上。比如:

docker run--链接一些兔子:rabbit-v/path/to/host/code:/home/user--命名一些芹菜-d芹菜

其中,/path/to/host/code是您的主机路径,/home/user是将其装载到实例上的路径。为什么在这种情况下/home/user?因为芹菜图像的Dockerfile将工作目录(WORKDIR)定义为/home/user

(注意:完成第(1)项的另一种方法是使用代码“内置”构建自定义docker映像,但我将把它留给读者作为练习。)

对于第(2)项,您需要创建一个芹菜配置文件来导入任务文件。这是一个更一般的问题,所以我将指出前面的stackoverflow答案:Celery接收到类型为的未注册任务(运行示例)

发表评论