uwsgi无法从docker内部装入Flask和芹菜

2024-05-23 18:06:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直试图通过docker运行我的flask应用程序,但uwsgi无法加载我的应用程序,芹菜和flask都会发生此错误。 奇怪的是,如果我正常运行相同的代码(,即,不使用docker),它就会按照我的预期工作

不确定我是否错过了为it工作设置一些环境变量的预期,任何帮助都会很好,提前谢谢

文件结构:

├── app
│   ├── blueprints
│   │   ├── ping
│   │   │   ├── api.py
│   │   │   ├── __init__.py
│   │   │   └── __pycache__
│   │   ├── tasks
│   │   │   ├── api.py
│   │   │   ├── __init__.py
│   │   │   └── service.py
│   ├── factories
│   │   ├── application.py
│   │   ├── celery.py
│   │   ├── extensions.py
│   │   ├── __init__.py
│   │   ├── logging.py
│   │   ├── mongo_db.py
│   │   ├── __pycache__
│   │   └── sentry.py
│   ├── flask_app.py
│   ├── __init__.py
│   ├── middlewares
│   │   ├── auth
│   │   │   ├── authorization.py
│   │   │   ├── __init__.py
│   │   │   └── __pycache__
│   │   ├── before_request
│   │   │   ├── __init__.py
│   │   │   ├── __pycache__
│   │   │   └── set_user.py
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   └── teardown_request
│   │       ├── __init__.py
│   │       ├── __pycache__
│   │       └── rollback_db_changes.py
│   ├── __pycache__
│   ├── settings
│   │   ├── config.py
│   │   ├── __init__.py
│   │   ├── logging.yaml
│   │   └── __pycache__
│   ├── utils
│   │   ├── base_models.py
│   │   ├── recommendation_util.py
│   │   ├── redis_util.py
│   └── worker.py
├── docker-compose.yml
├── requirements.txt
├── scripts
│   ├── Dockerfile-celery
│   └── Dockerfile-flask

app/flask\u app.py:

from flask_cors import CORS
from flask_jwt_extended import JWTManager
from flask_redis import FlaskRedis

from app.factories.application import setup_app
from app.factories.logging import setup_logging
from app.factories.mongo_db import setup_mongo_db
from app.factories.sentry import setup_sentry
from app.factories.celery import setup_celery

flask_app = setup_app()
CORS(flask_app, expose_headers="*")
setup_logging()
setup_sentry(flask_app)
celery = setup_celery(flask_app)
setup_mongo_db(flask_app)
JWTManager(flask_app)
redis_client = FlaskRedis(flask_app)

if __name__ == '__main__':
    flask_app.run()

app/woker.py:

from flask_redis import FlaskRedis

from app.factories.mongo_db import setup_mongo_db
from app.factories.application import setup_app
from app.factories.celery import setup_celery
from app.factories.logging import setup_logging
from app.factories.sentry import setup_sentry

flask_app = setup_app()
setup_logging()
setup_sentry(flask_app)
setup_mongo_db(flask_app)
redis_client = FlaskRedis(flask_app)

celery = setup_celery(flask_app)

docker compose.yml:

version: '2'
services:
    api:
        build:
            context: .
            dockerfile: scripts/Dockerfile-flask
        ports:
            - 5000:5000
        volumes:
            - .:/app
        depends_on:
            - redis
        environment:
            - ENVIRONMENT=docker
    worker:
        image: celery
        build:
            context: .
            dockerfile: scripts/Dockerfile-celery
        environment:
            - ENVIRONMENT=docker
        volumes:
            - .:/app
        depends_on:
            - redis
    redis:
        image: redis:latest
        ports:
            - 6379:6379
        command: [ "redis-server"]

Dockerfile烧瓶

FROM python:3.8
COPY . .
RUN pip install -r requirements.txt
EXPOSE 5000
CMD uwsgi --master --workers 5 --threads 50 --protocol http --socket 0.0.0.0:5000 --module app.flask_app:flask_app

Dockerfile芹菜

FROM python:3.8
ADD . .
RUN pip install -r requirements.txt
EXPOSE 5000
CMD celery -A app.worker.celery worker --loglevel=debug --uid=nobody --gid=nogroup

当我尝试在不使用docker compose的情况下正常运行docker文件时,docker文件中的CMD会按预期工作。当我在构建docker compose后运行docker compose时,会出现以下错误:

For Celery:

worker_1  | Error: Invalid value for '-A' / '--app': 
worker_1  | Unable to load celery application.
worker_1  | While trying to load the module app.worker.celery the following error occurred:
worker_1  | Traceback (most recent call last):
worker_1  |   File "/usr/local/lib/python3.8/site-packages/celery/bin/celery.py", line 53, in convert
worker_1  |     return find_app(value)
worker_1  |   File "/usr/local/lib/python3.8/site-packages/celery/app/utils.py", line 384, in find_app
worker_1  |     sym = symbol_by_name(app, imp=imp)
worker_1  |   File "/usr/local/lib/python3.8/site-packages/kombu/utils/imports.py", line 56, in symbol_by_name
worker_1  |     module = imp(module_name, package=package, **kwargs)
worker_1  |   File "/usr/local/lib/python3.8/site-packages/celery/utils/imports.py", line 100, in import_from_cwd
worker_1  |     return imp(module, package=package)
worker_1  |   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
worker_1  |     return _bootstrap._gcd_import(name[level:], package, level)
worker_1  |   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
worker_1  |   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
worker_1  |   File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
worker_1  | ModuleNotFoundError: No module named 'app.worker'


For Flask:
api_1     | ModuleNotFoundError: No module named 'app.flask_app'
api_1     | unable to load app 0 (mountpoint='') (callable not found or import error)


if i hit the url "http://localhost:5000/v1/ping", I get the following error:
api_1     | --- no python application found, check your startup logs for errors ---



Tags: dockerfrompyimportredisappflaskdb