无法使用 docker 编写启动芹菜



我有带有芹菜工人和 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 映像而不是芹菜映像

最新更新