作为 docker 容器运行的 Celery & RabbitMQ:收到类型 '...' 的未注册任务



我对docker、芹菜和rabbitMQ相对陌生。

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

1个拉比q:3个管理容器

# 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

(还有一些集装箱,但他们不应该对这个问题做任何事情)

任务文件

为了稍微了解一下芹菜和拉比,我在物理主机上创建了一个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'

因此,问题显然是,芹菜容器中的芹菜工人不知道任务模块。现在,由于我不是码头工人专家,我想问一下如何最好地将任务模块导入芹菜容器?

感谢您的帮助:)


2015年8月4日21:05:

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

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

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

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

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

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

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

  1. 将您的任务定义"放入"docker容器中
  2. 配置celener工作程序以加载这些任务定义

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

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

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

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

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

的未注册任务

相关内容

  • 没有找到相关文章

最新更新