我有带有芹菜工人和 Redis 的 Flask 应用程序,在本地机器上运行时,它按预期正常工作。然后我尝试对应用程序进行Dockerization。当我尝试使用sudo docker-compose up
构建/启动服务(即烧瓶应用程序、芹菜和 Redis 时,除芹菜外,所有服务都在运行,并将错误显示为
导入错误:没有名为"my_celery"的模块
但是,相同的代码在本地机器中工作,没有任何错误。任何人都可以提出解决方案吗?
Dockerfile
FROM python:3.5-slim
WORKDIR celery_sample
ADD . /celery_sample
RUN pip install -r requirements.txt
EXPOSE 8000
docker-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:
要求.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 图像 更多信息在这里。
WORKDIR
在 Dockerfile 中定义所有命令后为其设置工作目录,这意味着您尝试运行的命令将从该目录运行。芹菜的 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'
在撰写文件中链接服务后,可以使用服务名称作为主机名来访问服务。
您可以进行的最简单的更改是在 yaml 中正确映射芹菜图像的目录
celery:
image: celery:3.1.25
command: "celery worker -A my_celery -l INFO"
volumes:
- .:/home/user/
networks:
- webnet
同样如@vedarthk指出的那样,您应该为此使用官方 Python 映像而不是芹菜映像