构建 Flask docker 镜像时分配端口

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 中分配的端口根本不适用于我的情况。我希望了解这两种方法之间的差异以及何时使用每种方法。

v25*_*v25 6

关于这种方法:

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在生产中运行或类似运行,但这可能超出了本问题的范围。