我尝试在 docker 本地运行 Flask 应用程序,但遇到以下问题
app.py:
class App:
'''Base flask app'''
def __init__(self):
self.app = Flask(__name__)
@property
def flask_app(self) -> Flask:
'''Return flask app'''
return self.app
app_instance = App()
我的 Dockerfile:
...
CMD exec gunicorn --bind :8080 --workers 1 --threads 8 --timeout 0 app:app_instance.app
错误:
Failed to parse 'app_instance.app' as an attribute name or function call.
错误消息表明gunicorn无法正确解析'app_instance.app'。这通常意味着gunicorn无法找到它需要运行的应用程序实例。
使用gunicorn命令时,需要指定gunicorn应服务的应用程序模块和Flask应用程序实例。格式通常为 module_name:instance_name。
在 Dockerfile 中,您尝试将 app_instance.app 传递给 Gunicorn,但由于 app_instance 是 App 类的实例而不是模块,因此这不会按预期工作。
解决此问题的一种方法是确保 Flask 应用程序实例可用作可导入的模块级变量。您可以修改 app.py 以拥有指向 Flask 应用程序的模块级变量。以下是调整 app.py 的方法:
from flask import Flask
class App:
'''Base flask app'''
def __init__(self):
self.app = Flask(__name__)
@property
def flask_app(self) -> Flask:
'''Return flask app'''
return self.app
app_instance = App()
application = app_instance.flask_app # Make the Flask app available as 'application'
然后,在 Dockerfile 中,您可以调整 CMD 以指向应用程序变量:
CMD exec gunicorn --bind :8080 --workers 1 --threads 8 --timeout 0 app:application
通过这样做,您告诉gunicorn在应用程序模块中查找名为application的变量,该变量可以在模块级别访问并且可以导入。