作为docker集装箱运行的Celery&RabbitMQ:收到types为'…'的未注册任务

我对docker,芹菜和rabbitMQ比较陌生。

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

1x rabbitmq:3pipe理容器

# pull image from docker hub and install docker pull rabbitmq:3-management # run docker image docker run -d -e RABBITMQ_NODENAME=my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 rabbitmq:3-management 

1个芹菜容器

 # pull docker image from docker hub docker pull celery # run celery container docker run --link some-rabbit:rabbit --name some-celery -d celery 

(有更多的容器,但他们不应该对问题做任何事情)

任务文件

为了更好地了解芹菜和rabbitmq,我在物理主机上创build了一个tasks.py文件:

 from celery import Celery app = Celery('tasks', backend='amqp', broker='amqp://guest:guest@172.17.0.81/') @app.task(name='tasks.add') def add(x, y): return x + y 

整个设置实际上似乎工作得很好。 所以当我在tasks.py所在的目录中打开一个python shell并运行

 >>> from tasks import add >>> add.delay(4,4) 

任务排队,直接从芹菜工人拉。

然而,芹菜工人不知道关于日志的任务模块:

 $ docker logs some-celery [2015-04-08 11:25:24,669: ERROR/MainProcess] Received unregistered task of type 'tasks.add'. The message has been ignored and discarded. Did you remember to import the module containing this task? Or maybe you are using relative imports? Please see http://bit.ly/gLye1c for more information. The full contents of the message body was: {'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) Traceback (most recent call last): File "/usr/local/lib/python3.4/site-packages/celery/worker/consumer.py", line 455, in on_task_received strategies[name](message, body, KeyError: 'tasks.add' 

所以问题显而易见,芹菜容器里的芹菜工人不知道任务模块。 现在,因为我不是docker专家,所以我想问一下如何将任务模块导入芹菜容器?

任何帮助表示赞赏:)


编辑4/8/2015,21:05:

感谢Isowen的答案。 为了完整,这里是我所做的:

假设我的tasks.py位于本地机器的/home/platzhersh/celerystuff 。 现在我在同一个目录下创build一个celeryconfig.py文件,内容如下:

 CELERY_IMPORTS = ('tasks') CELERY_IGNORE_RESULT = False CELERY_RESULT_BACKEND = 'amqp' 

正如Isowen所提到的,芹菜search容器的/home/user用于任务和configuration文件。 因此,我们在启动时将/home/platzhersh/celerystuff到容器中:

 run -v /home/platzhersh/celerystuff:/home/user --link some-rabbit:rabbit --name some-celery -d celery 

这为我做了诡计。 希望这可以帮助一些有类似问题的人。 我现在尝试通过将任务也放在一个单独的docker容器中来扩展该解决scheme。

正如你怀疑的那样,问题是因为芹菜工人不知道任务模块。 有两件事你需要做:

  1. 将你的任务定义“放入”docker集装箱。
  2. configuration芹菜工作者加载这些任务定义。

对于Item(1),最简单的方法可能是使用“Docker Volume”将代码的主机目录挂载到celery docker实例上。 就像是:

 docker run --link some-rabbit:rabbit -v /path/to/host/code:/home/user --name some-celery -d celery 

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

(注意:完成Item(1)的另一种方法是创build一个代码“内置”的自定义泊坞窗图像,但我将把它作为读者的练习。)

对于第(2)项,您需要创build一个导入任务文件的芹菜configuration文件。 这是一个更普遍的问题,所以我会指向一个前面的stackoverflow答案: 芹菜收到未注册的任务的types(运行示例)