Ich habe eine Flask Python-App, die über Gunicorn aus einem Docker Linux-Container ausgeführt wird. Das Ausführen des Docker-Containers unter Ubuntu funktioniert lokal einwandfrei. Wenn der Container jedoch in die Azure-Container-Registrierung verschoben und dann als Azure-App bereitgestellt wird, schlägt dies mit den folgenden Fehlermeldungen fehl:
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
Im Azure-Portal unter Einstellungen> Konfiguration Ich habe die folgenden Anwendungseinstellungen :
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"]
Ich verstehe nicht, was HTTP-Pings am Port verursacht 80
schlägt fehl, wenn die Protokolle zeigen, dass Gunicorn http://0.0.0.0:80
abhört.
Ähnliche Fragen, bei denen das Problem nicht behoben wurde:
Контейнер должен реализовывать обработчик ошибок HTTP 404 (не найден).
Когда Azure запускает контейнер, запрос на прогрев проверяет сервер, запрашивая ресурсы, чтобы убедиться, что что он отвечает. Если один из запрошенных ресурсов не найден и в контейнере нет обработчика ошибок HTTP 404
(Not Found), запрос истечет по таймауту, и контейнер будет остановлен.
Флаг Azure PORT
не требуется. Флаг WEBSITES_PORT
должен быть установлен для любого порта, открытого в контейнере.
Установите WEBSITES_PORT
из интерфейса командной строки Azure следующим образом:
az webapp config appsettings set --resource-group <resource-group-name> --name <app-name> --settings WEBSITES_PORT=8000
Или используйте портал Azure:
Ваше приложение> Настройки> Конфигурация> Настройки приложения
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()