构建烧瓶时分配端口 docker 图片
Assigning port when building flask 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"]
根据我自己的经验,CMD 中分配的端口根本不适用于我的情况。我想了解这两种方法之间的差异以及何时使用每种方法。
CMD ["python3", "app.py", "--host=0.0.0.0", "--port=8000"]
表示:Python 运行 应用程序 app.py 并将 --host 和 --port 参数传递给该应用程序。使用这些参数由您的 app.py 决定。如果您的应用程序不处理这些标志,那么您不需要将它们添加到 CMD。
如果您的代码中有 app.run(host='0.0.0.0',port=8000)
,那么您的应用将始终侦听容器内的端口 8000。在这种情况下,您可以只使用 CMD ["python3", "app.py"]
如果您希望能够更改您的应用侦听的端口和主机,您可以添加一些代码以从命令行读取值。一旦您将应用程序设置为从命令行查看值,那么 运行 CMD ["python3", "app.py", "--host=0.0.0.0", "--port=8000"]
就有意义了
关于此方法:
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
和 __name__
这样的生产 WSGI 服务器执行程序,此块将 而不是 运行在这种情况下将不等于 "__main__"
,因此绕过 app.run
调用。
实际上,将 app.run
调用放在这个 if
块中意味着您可以 运行 使用 python app.py
开发服务器并避免 运行ning 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 中更改为 运行 和 gunicorn
或类似的生产,但这可能超出了这个问题的范围。
我最近使用 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"]
根据我自己的经验,CMD 中分配的端口根本不适用于我的情况。我想了解这两种方法之间的差异以及何时使用每种方法。
CMD ["python3", "app.py", "--host=0.0.0.0", "--port=8000"]
表示:Python 运行 应用程序 app.py 并将 --host 和 --port 参数传递给该应用程序。使用这些参数由您的 app.py 决定。如果您的应用程序不处理这些标志,那么您不需要将它们添加到 CMD。
如果您的代码中有 app.run(host='0.0.0.0',port=8000)
,那么您的应用将始终侦听容器内的端口 8000。在这种情况下,您可以只使用 CMD ["python3", "app.py"]
如果您希望能够更改您的应用侦听的端口和主机,您可以添加一些代码以从命令行读取值。一旦您将应用程序设置为从命令行查看值,那么 运行 CMD ["python3", "app.py", "--host=0.0.0.0", "--port=8000"]
关于此方法:
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
和 __name__
这样的生产 WSGI 服务器执行程序,此块将 而不是 运行在这种情况下将不等于 "__main__"
,因此绕过 app.run
调用。
实际上,将 app.run
调用放在这个 if
块中意味着您可以 运行 使用 python app.py
开发服务器并避免 运行ning 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 中更改为 运行 和 gunicorn
或类似的生产,但这可能超出了这个问题的范围。