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:
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.
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 :
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:
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é.
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
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()