发布python应用到azure app service的端口问题

app service 选择 web app, stack选择python3.9, 我自己的代码存放在azure devops repo中,host类型选择linux上的容器,

部署到appservice 其实就是把你的内容和代码,传到azure上一个单独vm中,vm的具体配置参数与ASP 绑定

,vm上会为你启动一个容器,这个容器中有你需要的runtime环境(python3.9, pip, venv),然后传入你的代码和项目文件,帮你从控制台注入各种配置项,然后帮你在容器中安装依赖requirements, 然后可选配置应用app的启动命令作为ENTRYPOINT,然后应用真正启动 根据配置暴露一个端口port,然后会有一个隐藏的七层反向代理 在你访问你的域名:80/443端口时,转发到vm:port。

自定义 Flask 主模块:默认情况下,应用服务假定 Flask 应用的主模块是 application.py 或 app.py。 如果主模块使用其他名称,则必须自定义启动命令。 例如,如果 Flask 应用的主模块是 hello.py,而该文件中的 Flask 应用对象名为 myapp,则命令如下所示:

DNS层面,azure会为你的web应用添加一个虚拟pub ip, 并为它创建一个特定默认域名,与appname绑定,默认, 同时会为你配置SNAT

服务在80和443端口,为你转发到容器暴露的端口:

myflask.azurewebsites.net

2024-06-14T09:05:32.246Z INFO - Starting container for site

2024-06-14T09:05:32.250Z INFO - docker run -d --expose=8000 --name myflask_0_71739c79 -e WEBSITE_USE_DIAGNOSTIC_SERVER=false -e WEBSITE_SITE_NAME=myflask -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=myflask.azurewebsites.net -e WEBSITE_INSTANCE_ID=d4dcc6cb8fa4d3af2b8b134980ef431447c31deb3840f994909c927561216d1a appsvc/python:3.9_20240502.3.tuxprod python3 app.py

2024-06-14T09:05:32.253Z INFO - Logging is not enabled for this container.Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.

2024-06-14T09:05:34.684Z INFO - Initiating warmup request to container myflask_0_71739c79 for site myflask

2024-06-14T09:05:36.758Z ERROR - Container myflask_0_71739c79 for site myflask has exited, failing site start

2024-06-14T09:05:36.768Z ERROR - Container myflask_0_71739c79 didn't respond to HTTP pings on port: 8000, failing site start. See container logs for debugging.

2024-06-14T09:05:36.776Z INFO - Stopping site myflask because it failed during startup./home/LogFiles/2024_06_14_10-30-1-205_default_docker.log (https://myflask.scm.azurewebsites.net/api/vfs/LogFiles/2024_06_14_10-30-1-205_default_docker.log)

如果代码文件不是常规默认的命名,需要单独配置一个启动命令,相当于容器的EP 你也可以空着不写,系统会自动寻找判断:

如果不写startup command, 你会发现azure 自动用gunicorn 方式,按4个进程 来帮你启动了app.py!

默认端口问题:

此时会发现app service 容器默认暴露的时候8000端口,

docker run -d --expose=8000

而我的flask应用是默认的5000端口,所以理所当然的启动检查失败, 然后会不停的循环启动

2024-06-16T14:19:50.763958371Z Updated PYTHONPATH to '/opt/startup/app_logs:/tmp/8dc8df717573640/antenv/lib/python3.9/site-packages'

2024-06-16T14:19:54.807631985Z 2024-06-16 14:19:54.807|INFO|app.py|161|flask app starting now

2024-06-16T14:19:54.808787168Z * Serving Flask app 'jack'

2024-06-16T14:19:54.808805211Z * Debug mode: off

2024-06-16T14:19:54.841765354Z WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

2024-06-16T14:19:54.841811189Z * Running on all addresses (0.0.0.0)

2024-06-16T14:19:54.841819475Z * Running on http://127.0.0.1:5000

2024-06-16T14:19:54.841825035Z * Running on http://169.254.130.2:5000

2024-06-16T14:19:54.841829563Z Press CTRL+C to quit/home/LogFiles/2024_06_16_10-30-1-137_docker.log (https://myflask.scm.azurewebsites.net/api/vfs/LogFiles/2024_06_16_10-30-1-137_docker.log)

2024-06-16T14:23:31.232Z INFO - Waiting for response to warmup request for container myflask_0_94f0b913. Elapsed time = 222.9678322 sec

2024-06-16T14:23:38.359Z ERROR - Container myflask_0_94f0b913 for site myflask did not start within expected time limit. Elapsed time = 230.0949392 sec

2024-06-16T14:23:38.447Z ERROR - Container myflask_0_94f0b913 didn't respond to HTTP pings on port: 8000, failing site start. See container logs for debugging.

2024-06-16T14:23:38.793Z INFO - Stopping site myflask because it failed during startup.

此时你会发现azure的最新文档里根本没有提到端口配置的地方和问题!作为例子的quick start里面也没有任何说明。

但是从文档里只轻描淡写,支出python应用会识别一个port变量来指定容器默认端口,这一点与目前容器中对应:

修改为 5000后,apply, 重新部署,终于成功。

最后想说:

既然支持portal 浏览器操作,而且是用的容器化部署,但是不管是overview, 还是configuration 还是environment variables中,居然没有一个地方明显的告诉你你的应用所在的容器中将会暴露哪个端口,默认值是多少,怎么覆盖!!凭看各种日志,登录容器,翻文档和猜想吗?

差评!

另外,APP service 作为PaaS, 除了不用购买和维护vm, 但是需要购买ASP计划。只需提交你的代码,自动帮你解决依赖和方便的配置管理,自动帮你管理启动和监视状态,看起来轻量化了一些。

真的可以从money或精力层面节省成本吗? 可能本身也比较鸡肋把。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值