web-dev-qa-db-ja.com

Azure:Dockerアプリエラー「…サイトが予想された制限時間内に開始されませんでした」と「コンテナXはポート80のHTTP pingに応答しませんでした」

私はFlask PythonアプリがDocker LinuxコンテナからGunicorn経由で実行されています。UbuntuでDockerコンテナを実行するとローカルで正常に動作しますが、コンテナがAzure Container RegistryにプッシュされてからAzureアプリとしてデプロイされると、次のエラーメッセージで失敗します。

  1. サイトmy-appのコンテナーmy-app_900f4cが予期された制限時間内に開始されませんでした
  2. コンテナmy-app_900f4cがポート80のHTTP pingに応答しなかったため、サイトの起動に失敗しました。

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.

デフォルトのDockerログ

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

Azure Portalの設定>構成で、次のアプリケーション設定を使用しています:

  • ポート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"]

ログにGunicornが80をリッスンしていることが示されている場合、ポートhttp://0.0.0.0:80でHTTP pingが失敗する原因を理解できません。

を含まない同様の質問は問題を解決しませんでした:

1
cpeisert

コンテナはHTTP 404(Not Found)エラーハンドラを実装する必要があります。

Azureがコンテナーを開始すると、ウォームアップ要求がリソースを要求してサーバーをチェックし、サーバーが応答していることを確認します。要求されたリソースの1つが見つからず、コンテナーにHTTP 404(見つかりません)エラーハンドラーがない場合、要求はタイムアウトし、コンテナーは停止します。

Dockerコンテナのポート構成

Azure PORTフラグは必要ありません。 WEBSITES_PORTフラグは、コンテナー内で公開されているポートに設定する必要があります。

次のように、Azure CLIからWEBSITES_PORTを設定します。

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