pla*_*rsh 17 python amqp rabbitmq celery docker
我对码头工人,芹菜和兔子相对较新.
在我们的项目中,我们目前有以下设置:1个运行多个docker容器的物理主机:
1x 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
Run Code Online (Sandbox Code Playgroud)
1x芹菜容器
# pull docker image from docker hub
docker pull celery
# run celery container
docker run --link some-rabbit:rabbit --name some-celery -d celery
Run Code Online (Sandbox Code Playgroud)
(还有一些容器,但它们不应该对问题做任何事情)
任务文件
为了更好地了解celery和rabbitmq,我在物理主机上创建了一个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
Run Code Online (Sandbox Code Playgroud)
实际上整个设置似乎工作得很好.所以当我在tasks.py所在的目录中打开一个python shell并运行时
>>> from tasks import add
>>> add.delay(4,4)
Run Code Online (Sandbox Code Playgroud)
任务排队并直接从芹菜工人那里取出.
但是,芹菜工作者不知道有关日志的任务模块:
$ 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'
Run Code Online (Sandbox Code Playgroud)
所以问题显然是,芹菜容器中的芹菜工人不知道任务模块.既然我不是码头专家,我想问一下如何最好地将任务模块导入芹菜容器中?
任何帮助表示赞赏:)
编辑4/8/2015,21:05:
感谢Isowen的回答.为了完整起见,这就是我所做的:
我们假设我tasks.py的位于我的本地机器上/home/platzhersh/celerystuff.现在我celeryconfig.py使用以下内容在同一目录中创建了一个:
CELERY_IMPORTS = ('tasks')
CELERY_IGNORE_RESULT = False
CELERY_RESULT_BACKEND = 'amqp'
Run Code Online (Sandbox Code Playgroud)
正如Isowen所提到的,芹菜/home/user在容器中搜索任务和配置文件.所以我们/home/platzhersh/celerystuff在启动时将其挂载到容器中:
run -v /home/platzhersh/celerystuff:/home/user --link some-rabbit:rabbit --name some-celery -d celery
Run Code Online (Sandbox Code Playgroud)
这对我有用.希望这可以帮助其他有类似问题的人.我现在尝试通过将任务也放在一个单独的docker容器中来扩展该解决方案.
lso*_*wen 11
正如您所怀疑的那样,问题是因为芹菜工人不知道任务模块.您需要做两件事:
对于Item(1),最简单的方法可能是使用"Docker Volume"将代码的主机目录挂载到芹菜docker实例上.就像是:
docker run --link some-rabbit:rabbit -v /path/to/host/code:/home/user --name some-celery -d celery
Run Code Online (Sandbox Code Playgroud)
/path/to/host/code您的主机路径在哪里,并且/home/user是将其安装在实例上的路径./home/user在这种情况下为什么?因为Dockerfile芹菜图像将工作目录(WORKDIR)定义为/home/user.
(注意:完成第(1)项的另一种方法是使用"内置"代码构建自定义泊坞窗图像,但我会将其作为练习留给读者.)
对于Item(2),您需要创建一个导入任务文件的celery配置文件.这是一个更普遍的问题,所以我将指出以前的stackoverflow答案:Celery收到未注册的类型任务(运行示例)
| 归档时间: |
|
| 查看次数: |
8535 次 |
| 最近记录: |