当前位置: 首页 > 面试题库 >

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

雍飞雨
2023-03-14
问题内容

我对docker,celery和rabbitMQ比较陌生。

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

1个rabbitmq: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个celery容器

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

(还有更多的容器,但是它们不必对此问题做任何事情)

任务文件

为了稍微了解celery和rabbitmq,我在物理主机上创建了一个task.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

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

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

任务被排队,并直接从celery工人处撤出。

但是,celery工作者不知道与日志有关的任务模块:

$ 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'

因此,问题显然似乎出在celery容器中的celery工人不知道任务模块。现在,由于我不是Docker专家,所以我想问一下如何最好地将task模块导入到celery容器中?

任何帮助表示赞赏:)

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

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

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

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

如Isowen所述,celery/home/user在容器中搜索任务和配置文件。因此,我们/home/platzhersh/celerystuff在开始时将挂载到容器中:

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

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


问题答案:

您怀疑,问题是因为Celery工人不知道任务模块。您需要做两件事:

  1. 将任务定义“放入” Docker容器。
  2. 配置celery worker来加载那些任务定义。

对于项目(1),最简单的方法可能是使用“ Docker卷”将代码的主机目录装载到celery 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是这种情况?因为Dockerfilecelery映像的将工作目录(WORKDIR)定义为/home/user

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

对于项目(2),您需要创建一个导入任务文件的Celery配置文件。这是一个更普遍的问题,因此,我将指向先前的stackoverflow答案:Celery收到类型为未注册的任务(运行示例)



 类似资料:
  • 问题内容: 我正在尝试从Celery文档中运行示例。 我跑: task.py: run_task.py: 在同一文件夹celeryconfig.py中: 当我运行“ run_task.py”时: 在python控制台上 celeryd服务器上的错误 请说明问题所在。 问题答案: 您可以在该类中看到当前已注册任务的列表。可能是您的celeryconfig(在当前目录中)不在,因此celery找不到它

  • 问题内容: 我写了一个文件 并如下 我已经启动了redis服务器,也已经启动了celery服务器。但是当我运行task.py时,出现以下错误: 可能的原因是什么 问题答案: 嘿,我解决了我添加的一件事 在我的档案中,我获得了成功。

  • 问题内容: 我需要使用docker-compose创建Rails和Mysql容器。当我尝试使用创建容器之间的链接时,我得到 无法启动容器9b271c58cf6aecaf017dadaf5b无法链接到未运行的容器:/ puma_db_1 AS / puma_web_1 / db 档案 Docker文件 docker-compose.yml 问题答案: 容器很可能无法启动。 仅启动服务以确保其正常运行

  • Debug.DockerFile 运行命令 正在连接RabbitMQ

  • 问题内容: 我从dockerfile构建了Docker映像。我看到映像已成功构建,但是该如何处理?它不应该能够作为容器运行吗? 问题答案: 运行它的具体方法取决于您是否为图像指定了标签/名称。 使用名称(让我们使用 Ubuntu ): 没有名称,只需使用ID: 请参阅 Docker运行参考 以获取更多信息。

  • 我正在尝试使用这张图片https://hub.docker.com/r/ibmcom/cloudant-developer/对于docker compose,当我使用原始指令时,它可以工作,但是当我将其转换为docker compose格式时,它无法正常工作,我看到了仪表板页面,但它是空的,似乎已损坏。 原始运行命令: 我创建的撰写文件: 谢谢你的帮助。 另外,我确实手动执行了许可协议的命令