Azure: Error de la aplicación Docker "...el sitio no se inició dentro del límite de tiempo esperado " y "El contenedor X no respondió a los pings HTTP en el puerto 80"

Tengo una aplicación Flask Python que se ejecuta a través de Gunicorn desde un contenedor Docker Linux. La ejecución del contenedor Docker en Ubuntu funciona bien localmente, pero cuando el contenedor se envía al Registro de contenedores de Azure y luego se implementa como una aplicación de Azure, falla con los siguientes mensajes de error:

  1. El contenedor my-app_900f4c para el sitio my-app no se inició dentro del límite de tiempo esperado.
  2. El contenedor my-app_900f4c no respondió a los pings HTTP en el puerto: 80, no se pudo iniciar el sitio.

Registro de Docker

2020-02-17 INFO  - Pull Image successful, Time taken: 0 Minutes and 15 Seconds2020-02-17 INFO  - Starting container for site2020-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-app2020-02-17 ERROR - Container my-app_900f4c for site my-app did not start within expected time limit. Elapsed time = 255.9515056 sec2020-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.

Registro de Docker Predeterminado

2020-02-17 [1] [INFO] Starting gunicorn 20.0.42020-02-17 [1] [INFO] Listening at: http://0.0.0.0:80 (1)2020-02-17 [1] [INFO] Using worker: gthread2020-02-17 [7] [INFO] Booting worker with pid: 72020-02-17 [8] [INFO] Booting worker with pid: 82020-02-17 [9] [INFO] Booting worker with pid: 92020-02-17 [10] [INFO] Booting worker with pid: 10

En el Portal de Azure, en Configuración & gt; Configuración Tengo lo siguiente Configuración de la aplicación:

  • PUERTO 80
  • PÁGINAS WEB_PUERTO 80

Dockerfile

FROM python:3.8-slim-busterLABEL Name=my_app Version=0.0.1EXPOSE 80WORKDIR /appRUN python3 -m pip install --upgrade pipRUN python3 -m pip install -r requirements.txtADD . /appCMD ["gunicorn", "-c", "gunicorn.conf.py", "main:app"]

No entiendo qué está causando los pings HTTP en el puerto 80 para fallar, cuando los registros muestran que Gunicorn está escuchando http://0.0.0.0:80.

Preguntas similares que tienen ni resuelto el problema:

El contenedor debe implementar un controlador de errores HTTP 404 (No encontrado).

Cuando Azure inicia un contenedor, el solicitud de calentamiento comprueba el servidor solicitando recursos para asegurarse de que responde. Si no se encuentra uno de los recursos solicitados y el contenedor no tiene HTTP 404 Controlador de errores (No encontrado), la solicitud se agotará y el contenedor se detendrá.

Configuración de Puerto de Contenedor de Docker

Azure PORT la bandera no es necesaria. El WEBSITES_PORT la bandera debe establecerse en cualquier puerto que esté expuesto dentro del contenedor.

Establecer WEBSITES_PORT desde la CLI de Azure de la siguiente manera:

az webapp config appsettings set --resource-group <resource-group-name> --name <app-name> --settings WEBSITES_PORT=8000

O use el portal de Azure:
Su aplicación > Configuraciones > Configuración > configuración de la Aplicación

Ejemplo de Frasco-Controlador de Errores HTTP 404

from flask import Flaskfrom werkzeug.exceptions import Forbidden, HTTPException, NotFound, RequestTimeout, Unauthorizedapp = 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'), 408if __name__ == '__main__':    app.run()