Docker 容器端口配置

Docker 容器端口配置

我有一个 Flask Python 应用程序,它通过 Gunicorn 从 Docker Linux 容器运行。在 Ubuntu 上运行 Docker 容器在本地运行良好,但是当将容器推送到 Azure 容器注册表然后作为 Azure 应用程序部署时,它会失败并显示以下错误消息:

  1. 站点 my-app 的容器 my-app_900f4c 未在预期的时间限制内启动。
  2. 容器 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()

相关内容