我一直在尝试通过 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 ---