我有一个 Flask Python 应用程序,它通过 Gunicorn 从 Docker Linux 容器运行。在 Ubuntu 上运行 Docker 容器在本地运行良好,但是当将容器推送到 Azure 容器注册表然后作为 Azure 应用程序部署时,它会失败并显示以下错误消息:
- 站点 my-app 的容器 my-app_900f4c 未在预期的时间限制内启动。
- 容器 my-app_900f4c 没有响应端口 80 上的 HTTP ping,站点启动失败。
Docker 日志
2020-02-17 INFO - Pull Image successful, Time taken: 0 Minutes and 15 Seconds
2020-02-17 INFO - Starting container for site
2020-02-17 INFO - docker run -d -p 9031:80 --name my-app_900f4c -e PORT=80 -e WEBSITES_PORT=80 -e WEBSITE_SITE_NAME=my-app -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=my-app.azurewebsites.net -e WEBSITE_INSTANCE_ID=eaaf...51e441df96704916ba7b506b6150b26cdc7 -e HTTP_LOGGING_ENABLED=1 myazureappregistry.azurecr.io/my_app:v1
2020-02-17 INFO - Initiating warmup request to container my-app_900f4c for site my-app
2020-02-17 ERROR - Container my-app_900f4c for site my-app did not start within expected time limit. Elapsed time = 255.9515056 sec
2020-02-17 ERROR - Container my-app_900f4c didn't respond to HTTP pings on port: 80, failing site start. See container logs for debugging.
2020-02-17 INFO - Stopping site my-app because it failed during startup.
默认 Docker 日志
2020-02-17 [1] [INFO] Starting gunicorn 20.0.4
2020-02-17 [1] [INFO] Listening at: http://0.0.0.0:80 (1)
2020-02-17 [1] [INFO] Using worker: gthread
2020-02-17 [7] [INFO] Booting worker with pid: 7
2020-02-17 [8] [INFO] Booting worker with pid: 8
2020-02-17 [9] [INFO] Booting worker with pid: 9
2020-02-17 [10] [INFO] Booting worker with pid: 10
在 Azure 门户中设置 > 配置我有以下内容应用程序设置:
- 端口 80
- 网站端口 80
Dockerfile
FROM python:3.8-slim-buster
LABEL Name=my_app Version=0.0.1
EXPOSE 80
WORKDIR /app
RUN python3 -m pip install --upgrade pip
RUN python3 -m pip install -r requirements.txt
ADD . /app
CMD ["gunicorn", "-c", "gunicorn.conf.py", "main:app"]
80
当日志显示 Gunicorn 正在监听时,我不明白是什么原因导致端口上的 HTTP ping失败http://0.0.0.0:80
。
类似的问题不是解决了该问题:
答案1
容器必须实现 HTTP 404(未找到)错误处理程序。
当 Azure 启动容器时,预热请求通过请求资源来检查服务器以确保其正在响应。如果未找到所请求的资源之一,并且容器没有HTTP 404
(Not Found) 错误处理程序,则请求将超时,并且容器将停止。
Docker 容器端口配置
PORT
不需要Azure标志。WEBSITES_PORT
应将标志设置为容器内公开的任何端口。
从 Azure CLI设置WEBSITES_PORT
如下:
az webapp config appsettings set --resource-group <resource-group-name> --name <app-name> --settings WEBSITES_PORT=8000
或者使用 Azure 门户:
您的应用 > 设置 > 配置 > 应用程序设置
Flask 示例 - HTTP 404 错误处理程序
from flask import Flask
from werkzeug.exceptions import Forbidden, HTTPException, NotFound, RequestTimeout, Unauthorized
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello Flask!"
@app.errorhandler(NotFound)
def page_not_found_handler(e: HTTPException):
return render_template('404.html'), 404
@app.errorhandler(Unauthorized)
def unauthorized_handler(e: HTTPException):
return render_template('401.html'), 401
@app.errorhandler(Forbidden)
def forbidden_handler(e: HTTPException):
return render_template('403.html'), 403
@app.errorhandler(RequestTimeout)
def request_timeout_handler(e: HTTPException):
return render_template('408.html'), 408
if __name__ == '__main__':
app.run()