docker工人不能启动芹菜

我有芹菜工人和Redis的Flask应用程序,并且在本地机器上运行时,它正常工作正常。 然后我尝试Dockerize应用程序。 当我尝试使用sudo docker-compose up构build/启动服务(例如,flask应用程序,Celery和Redis)时, sudo docker-compose up所有服务正在运行,除了Celery,并显示错误

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

但是,在本地机器上工作的代码没有任何错误。 任何人都可以提出解决scheme吗?

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' 

首先,芹菜图片已被弃用,转而使用标准的python图片。

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

由于你的代码被挂载在/celery_smaple ,工作目录是/home/user ,Celery无法find你的python模块。

一种替代方法是进入挂载目录并执行命令:

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

注意命令

另一个是创build自己的图像与WORKDIR设置为/celery_sample例如:

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

build立你自己的图像后,你可以通过改变芹菜服务的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: 

你的configuration文件应该是:

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

一旦链接了撰写文件中的服务,就可以通过使用服务名称作为主机名来访问该服务。

你可以做的最简单的改变是在yaml中正确映射芹菜图像的目录

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

另外@vedarthk指出,你应该使用官方的Python图像来代替芹菜图像