关于这种方法:
if __name__ == "__main__":
app.run(host='0.0.0.0',port=8000, debug=True)
__name__ 等于"__main__",当应用程序直接使用python 解释器(使用命令python app.py 执行)启动时——这是一个python 技术,与Flask 无关。在这种情况下,app.run 函数被调用,它接受所述的各种参数。 app.run 导致 Werkzeug 开发服务器运行。
如果您使用像gunicorn 这样的生产WSGI 服务器执行程序,则此块将不运行,因为在这种情况下__name__ 将不等于"__main__",所以app.run 调用被绕过。
实际上,将app.run 调用放在这个if 块中意味着您可以使用python app.py 运行开发服务器,并避免在gunicorn 或类似产品中导入相同的代码时运行开发服务器。
有很多较早的教程或帖子都引用了上述方法。现代版本的 Flask 附带 flask 命令,旨在替换它。所以基本上没有if 块,您可以启动开发服务器,以类似于gunicorn 的方式导入您的应用程序对象:
flask run -h 0.0.0.0 -p 8000
这会自动在app.py 中查找名为app 的对象,并接受主机和端口选项,如您在flask run --help 中所见:
Options:
-h, --host TEXT The interface to bind to.
-p, --port INTEGER The port to bind to.
此方法的一个优点是,如果您使用自动重新加载器并引入语法错误,开发服务器不会崩溃。当然,相同的代码将与gunicorn 等生产服务器兼容。
考虑到上述情况,关于您传递的命令:
python app.py --host=0.0.0.0 --port=8000
我不确定您是否对引用flask 命令支持的选项感到困惑,但是要使这个选项正常工作,您需要手动编写一些代码来处理这些选项。这可以通过像argparse 这样的python 模块来完成,但考虑到flask 命令实际上支持开箱即用,这可能是多余的。
总结:您可能应该删除 if 块,并且您的 Dockerfile 应该包含:
CMD ["flask", "run", "--host=0.0.0.0", "--port=8000"]
您可能还希望检查FLASK_ENV 环境变量is set 到development 以使用自动重新加载器,并注意CMD 行需要在此Dockerfile 中更改以使用@987654357 运行@ 或类似的产品,但这可能超出了这个问题的范围。