This question already has answers here:
Deploying a minimal flask app in docker - server connection issues

(6个答案)



Are a WSGI server and HTTP server required to serve a Flask app?

(2个答案)


3个月前关闭。




我有一个Flask RestX的flask应用程序,可以与flask run一起很好地工作,但是与Docker有关的导入问题。我已经看到了一些有关此问题和答案,但它们都涉及到Gunicorn,但是我没有使用Gunicorn
这是我的文件夹结构。我正在运行docker-compose文件,该文件使用flask.dev.dockerfile以及Redis容器。
python - 导入无法在Docker中与Flask一起使用(没有gunicorn!)-LMLPHP
因此,我想使用RedisDatabase文件中的redis包装器database.py。 PyCharm将其插入为
from ivd_app.database import RedisDatabase
以及__init__.py文件的其余部分,总结如下:
from flask import Flask, request
from flask_cors import CORS
from flask_restx import Api, Resource, fields

def create_app(db=None):
    app = Flask(__name__, instance_relative_config=True)

    if (db is None):
        db = RedisDatabase()

    api = Api(app, version='0.0.1', title='IVD')

    config_endpoint = api.namespace(
        'config', description='APIs to Send configuration to and from the Front End'
    )

    config_model = api.model('Configuration', {
        # the model
    })

    @config_endpoint.route('/')
    class ConfigurationEndpoint(Resource):

        @config_endpoint.expect(config_model, validate=True)
        def put(self):
            # the put endpoint

        def get(self):
            # the get endpoint

    return app

# if __name__ == "__main__":
#    create_app().run(host="0.0.0.0", debug=True)
设置环境变量后,当我使用dockerfile中的CMD flask run时,应用程序运行。但是由于某种原因,我无法访问Flask服务器,所以我取消了底部的注释,因为我知道这些行之有效,并在Dockerfile中使用CMD python ivd_app/__init__.py。但是容器退出了:
flask_1  | Traceback (most recent call last):
flask_1  |   File "ivd_app/__init__.py", line 38, in <module>
flask_1  |     from ivd_app.database import RedisDatabase
flask_1  | ModuleNotFoundError: No module named 'ivd_app'
如果我删除导入语句,并将RedisDatabase类放入__init__.py文件,则整个应用程序当然可以工作。但我想将其分成另一个文件。
我该如何解决?

最佳答案

默认情况下,Flask绑定(bind)到127.0.0.1,因此,如果您使用CMD flask run,它将拒绝来自容器外部的连接。
如果我没记错的话,您必须要么

ENV FLASK_RUN_HOST 0.0.0.0
CMD flask run
要么
CMD flask run --host 0.0.0.0
至于其他方法,我会尝试
CMD python -m ivd_app
因为您似乎尝试运行模块而不是独立脚本。

07-28 03:58
查看更多