作者:饰间人爱642_370 | 来源:互联网 | 2023-01-28 20:41
我在Celery worker和Redis上安装了Flask应用程序,并且在本地计算机上运行时按预期正常工作。然后,我尝试对应用程序进行Dockerize。当我尝试构建/启动服务(例如flask app,Celery和Redis)时,使用sudo docker-compose up
除Celery之外的所有服务,并且显示错误为
ImportError:没有名为“ my_celery”的模块
但是,相同的代码在本地计算机上工作没有任何错误。有人可以提出解决方案吗?
Docker文件
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:
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'
vedarthk..
5
所有的芹菜图像的首先是有利于标准的Python图像的详细信息弃用这里。
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
celery服务的使用组合文件
编辑
您需要将服务彼此链接才能进行通信:
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'
在组合文件中链接了服务后,就可以使用服务名作为主机名来访问服务。
1> vedarthk..:
所有的芹菜图像的首先是有利于标准的Python图像的详细信息弃用这里。
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
celery服务的使用组合文件
编辑
您需要将服务彼此链接才能进行通信:
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'
在组合文件中链接了服务后,就可以使用服务名作为主机名来访问服务。