在Docker容器中运行时,芹菜不起作用

时间:2018-08-07 21:07:24

标签: django docker rabbitmq celery

我正在尝试开发一个由侦听器组成的应用程序,该侦听器会将事件发送到RabbitMQ,Celery从队列中提取事件。

在本地运行所有组件时,我的应用程序按预期工作。如果我的侦听器在本地运行,并且所有其他组件都在Docker容器中运行,那么它也可以工作。但是,如果我也在容器中运行侦听器,那么Celery将不会收到任何事件。

该应用程序基于Django,并且与Celery的连接是这样完成的:

app = Celery('mini_iot')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

在settings.py中,我有:

CELERY_BROKER_URL = 'amqp://rabbitmq'

其中Rabbitmq是容器的主机名。

侦听器使用delay函数将任务发送给Celery。

docker-compose是:

version: '3'
services:
 listener:
  image: core-app 
  command: python manage.py runscript listener
  volumes:
   - .:/mini-iot
  depends_on:
   - rabbitmq
   - mqtt
  working_dir: /mini-iot/mini_iot
 worker:
  image: core-app 
  command: celery -A mini_iot worker --loglevel=info -f log2.txt
  volumes:
   - .:/mini-iot
  depends_on:
   - rabbitmq
   - mqtt
  working_dir: /mini-iot/mini_iot
 rabbitmq:
  image: rabbitmq:3.6.10
  volumes:
   - /var/lib/rabbitmq:/var/lib/rabbitmq
  ports:
   - "5672:5672"
   - "15672:15672"

有人可以帮助我调试问题吗,或者有人对问题是什么有想法吗?

容器可以在正确的端口上相互通信。我已经使用telnet进行了测试。

2 个答案:

答案 0 :(得分:0)

您应将links分别添加到listenerworker中:

version: '3'
services:
 listener:
  image: core-app 
  command: python manage.py runscript listener
  volumes:
   - .:/mini-iot
  links:
   - rabbitmq
  depends_on:
   - rabbitmq
   - mqtt
  working_dir: /mini-iot/mini_iot
 worker:
  image: core-app 
  command: celery -A mini_iot worker --loglevel=info -f log2.txt
  volumes:
   - .:/mini-iot
  links:
   - rabbitmq
  depends_on:
   - rabbitmq
   - mqtt
  working_dir: /mini-iot/mini_iot
 rabbitmq:
  image: rabbitmq:3.6.10
  volumes:
   - /var/lib/rabbitmq:/var/lib/rabbitmq
  ports:
   - "5672:5672"
   - "15672:15672"

答案 1 :(得分:0)

我认为您的CELERY_BROKER_URL应该是

amqp://guest:guest@rabbitmq:5672

根据rabbitmq docker文档(https://hub.docker.com/_/rabbitmq/),默认用户名和密码为guest / guest。