Azure: Docker App Error “… Site wurde nicht innerhalb des erwarteten Zeitlimits gestartet "Und" Container X hat nicht auf HTTP-Pings an Port 80 geantwortet "

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:

  1. Container my-app_900f4c für Site my-app hat dies getan Nicht innerhalb des erwarteten Zeitlimits starten.
  2. Container my-app_900f4c hat nicht auf HTTP-Pings an Port: 80 geantwortet, Standortstart fehlgeschlagen.

Docker-Protokoll

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.

Standard-Docker-Protokoll

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 :

  • PORT 80
  • 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"]

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:

0
задан 24 February 2020 в 02:44
1 ответ

Контейнер должен реализовывать обработчик ошибок HTTP 404 (не найден).

Когда Azure запускает контейнер, запрос на прогрев проверяет сервер, запрашивая ресурсы, чтобы убедиться, что что он отвечает. Если один из запрошенных ресурсов не найден и в контейнере нет обработчика ошибок HTTP 404 (Not Found), запрос истечет по таймауту, и контейнер будет остановлен.

Конфигурация порта контейнера Docker

Флаг 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:
Ваше приложение> Настройки> Конфигурация> Настройки приложения

Пример 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()
0
ответ дан 26 February 2020 в 00:42

Теги

Похожие вопросы