用docker-compose无法启动Celery

时间:2017-07-21 16:52:46

标签: docker flask celery docker-compose dockerfile

我有Celery应用程序与Celery worker和Redis,它在本地计算机上运行时正常工作。然后我尝试Dockerize应用程序。当我尝试使用sudo docker-compose up构建/启动服务(即烧瓶应用程序,Celery和Redis)时,所有服务都在运行,除了Celery并显示错误

  

ImportError:没有名为'my_celery'的模块

但是,相同的代码在本地机器上工作没有任何错误。任何人都可以建议解决方案吗?

Dockerfile

FROM python:3.5-slim
WORKDIR celery_sample
ADD . /celery_sample
RUN pip install -r requirements.txt
EXPOSE 8000

搬运工-compose.yml

version: "3"
services:

  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: "python my_celery.py"
    ports:
      - "8000:8000"
    networks:
      - webnet
    volumes:
      - .:/celery_sample

  redis:
    image: redis
    networks:
      - webnet


  celery:
    image: celery:3.1.25
    command: "celery worker -A my_celery -l INFO"
    volumes:
      - .:/celery_sample
    networks:
      - webnet

networks:
  webnet:

requirements.txt

flask==0.10
redis
requests==2.11.1
celery==3.1.25

my_celery.py (请忽略逻辑)

from flask import Flask
from celery import Celery
flask_app = Flask(__name__)
celery_app = Celery('my_celery')
celery_app.config_from_object('celeryconfig')



@celery_app.task
def add_celery():
    return str(int(10)+int(40))


@flask_app.route('/')
def index():
    return "Index Page"

@flask_app.route('/add')
def add_api():
    add_celery.delay()
    return "Added to Queue"

if __name__ == '__main__':
    flask_app.debug = True
    flask_app.run(host='0.0.0.0', port=8000)

celeryconfig.py

## Broker settings.
BROKER_URL = 'redis://localhost:6379/0'    
## Using the database to store task state and results.
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

2 个答案:

答案 0 :(得分:3)

首先,不推荐使用芹菜图片,而选择标准python图片更多信息here

WORKDIR设置Dockerfile中定义的所有命令的工作目录,这意味着您尝试运行的命令将从该目录运行。 celery的Docker镜像将工作目录设置为/home/user

由于您的代码已挂载在/celery_smaple且工作目录为/home/user,因此Celery无法找到您的python模块。

另一种方法是cd到已安装的目录并执行命令:

celery:
    image: celery:3.1.25
    command: "cd /celery_sample && celery worker -A my_celery -l INFO"
    volumes:
      - .:/celery_sample
    networks:
      - webnet

注意命令

另一个是创建自己的图片,WORKDIR设置为/celery_sample,例如:

FROM python:3.5
RUN pip install celery==3.1.25
WORKDIR /celery_sample

构建自己的图像后,您可以通过更改芹菜服务的image来使用撰写文件

修改

您需要将服务相互链接才能进行沟通:

version: "3"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: "python my_celery.py"
    ports:
      - "8000:8000"
    networks:
      - webnet
    volumes:
      - .:/celery_sample
    links:
      - redis

  redis:
    image: redis
    networks:
      - webnet

  celery:
    image: celery:3.1.25
    command: "celery worker -A my_celery -l INFO"
    volumes:
      - .:/home/user
    networks:
      - webnet
    links:
      - redis

networks:
  webnet:

,您的配置文件应为:

## Broker settings.
BROKER_URL = 'redis://redis:6379/0'    
## Using the database to store task state and results.
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'

在compose文件中链接服务后,您可以使用服务名称作为主机名来访问服务。

答案 1 :(得分:2)

您可以做的最简单的更改是在yaml

中正确映射芹菜图像的目录
  celery:
    image: celery:3.1.25
    command: "celery worker -A my_celery -l INFO"
    volumes:
      - .:/home/user/
    networks:
      - webnet

同样@vedarthk指出,你应该使用官方的Python图像而不是芹菜图像