web-dev-qa-db-fra.com

Azure: Erreur d'application Docker "... Le site n'a pas démarré dans la limite de temps prévue" et "conteneur x n'a pas répondu à HTTP Pings sur le port 80"

J'ai une application Flask Python qui fonctionne via GunCorn à partir d'un conteneur Docker Linux. L'exécution du conteneur Docker sur Ubuntu fonctionne bien localement, mais lorsque le conteneur est poussé sur le registre de conteneur Azure, puis déployé sous forme d'application Azure, elle échoue aux messages d'erreur suivants:

  1. conteneur My-App_900F4C pour le site My-APP n'a pas démarré dans la limite de temps prévue.
  2. conteneur My-APP_900F4C n'a pas répondu à HTTP Pings sur le port: 80, Démarrer le site défaillant.

Journal de 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.

Log Docker par défaut

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

Dans le portail Azure sous Paramètres> Configuration J'ai les suivants applications Paramètres :

  • Port 80
  • Sites websites_port 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"]

Je ne comprends pas ce qui est causé des pings http sur le port 80 Pour échouer, lorsque les journaux montrent que GunCorn écoute http://0.0.0.0:80.

Des questions similaires qui ont non résolu le problème:

2
cpeisert

Le conteneur doit mettre en place un gestionnaire d'erreur HTTP 404 (non trouvé).

Lorsque Azure démarre un conteneur, la demande d'échauffement vérifie le serveur en demandant des ressources pour s'assurer qu'elle répond. Si l'une des ressources demandées n'est pas trouvée et que le conteneur n'a pas de HTTP 404 (Non trouvé) Handlicateur d'erreur, puis la demande du délai d'attente et le conteneur sera arrêté.

Configuration du port de conteneur Docker

Le drapeau Azure PORT n'est pas nécessaire. Les WEBSITES_PORT Le drapeau doit être défini sur le port étant exposé dans le conteneur.

Régler WEBSITES_PORT De la CLI Azure comme suit:

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

Ou utilisez le portail Azure:
votre application> Paramètres> Configuration> Paramètres d'application

Exemple de fiole - HTTP 404 Handlicateur d'erreur

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()
1
cpeisert