Mei*_*Zhu 5 flask docker docker-image
我最近使用 Flask 创建了一个应用程序,并将 py 文件放入 docker 容器中。然而,我对人们分配端口的在线案例感到困惑。
首先在我写的 py 文件的底部
if __name__ == "__main__":
app.run(host='0.0.0.0',port=8000, debug=True)
在某些情况下,我看到人们在制作 dockerfile 时在 CMD 中指定端口
CMD ["python3", "app.py", "--host=0.0.0.0", "--port=8000"]
Run Code Online (Sandbox Code Playgroud)
根据我自己的经验,CMD 中分配的端口根本不适用于我的情况。我希望了解这两种方法之间的差异以及何时使用每种方法。
关于这种方法:
if __name__ == "__main__":
app.run(host='0.0.0.0',port=8000, debug=True)
Run Code Online (Sandbox Code Playgroud)
__name__等于"__main__"直接使用解释器启动应用程序python(使用命令执行python app.py) - 这是 python 技术,与 Flask 无关。在这种情况下,该app.run函数被调用,并且它接受所述的各种参数。 app.run导致 Werkzeug 开发服务器运行。
如果您使用生产 WSGI 服务器执行程序,则该块将不会gunicorn运行,在这种情况下, as__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这会自动查找名为in的对象app.py,并接受主机和端口选项,如您所见flask run --help:
Options:
-h, --host TEXT The interface to bind to.
-p, --port INTEGER The port to bind to.
Run Code Online (Sandbox Code Playgroud)
此方法的优点之一是,如果您使用自动重新加载器并引入语法错误,开发服务器不会崩溃。当然,相同的代码将与像gunicorn.
考虑到上述内容,关于您传递的命令:
python app.py --host=0.0.0.0 --port=8000
Run Code Online (Sandbox Code Playgroud)
我不确定您是否对flask命令支持的选项的引用感到困惑,但要使这个选项正常工作,您需要手动编写一些代码来对这些选项执行某些操作。这可以使用像 之类的 python 模块来完成,但是考虑到该命令实际上支持开箱即用,这argparse可能是多余的。flask
总而言之:您应该删除该if块,并且您的 Dockerfile 应包含:
CMD ["flask", "run", "--host=0.0.0.0", "--port=8000"]
Run Code Online (Sandbox Code Playgroud)
您可能还希望检查FLASK_ENV环境变量设置为development使用自动重新加载器,并注意CMD需要更改此 Dockerfile 中的行才能gunicorn在生产中运行或类似运行,但这可能超出了本问题的范围。
| 归档时间: |
|
| 查看次数: |
4675 次 |
| 最近记录: |