uwsgi 无法从 docker 内部加载烧瓶和芹菜

时间:2021-06-26 21:40:28

标签: python docker flask celery uwsgi

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

不确定我是否缺少设置一些环境变量以使其按预期工作,任何帮助都会很棒,提前致谢!

文件结构:

├── 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_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-flask

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-celery

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 文件中的 CMD 按预期工作,当我在构建后运行 docker-compose up 时,出现以下错误:

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 ---


0 个答案:

没有答案