Azure

Azure:Docker 應用程序錯誤“…站點未在預期時間限制內啟動”和“容器 X 未響應埠 80 上的 HTTP ping”

  • February 24, 2020

我有一個 Flask Python 應用程序,它通過 Gunicorn 從 Docker Linux 容器執行。在 Ubuntu 上執行 Docker 容器在本地執行良好,但是當容器被推送到 Azure 容器系統資料庫然後部署為 Azure 應用程序時,它會失敗並顯示以下錯誤消息:

  1. 站點 my-app 的容器 my-app_900f4c 未在預期時間限制內啟動。
  2. 容器 my-app_900f4c 沒有響應埠:80 上的 HTTP ping,站點啟動失敗。

碼頭工人日誌

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 門戶中,我有以下應用程序設置

  • 埠 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"]

80當日誌顯示 Gunicorn 正在偵聽時,我不明白是什麼導致埠上的 HTTP ping失敗http://0.0.0.0:80

尚未解決問題的類似問題:

容器必須實現 HTTP 404(未找到)錯誤處理程序。

當 Azure 啟動容器時,預熱請求會通過請求資源來檢查伺服器,以確保它正在響應。如果未找到請求的資源之一併且容器沒有HTTP 404(未找到)錯誤處理程序,則請求將超時並且容器將停止。

Docker 容器埠配置

PORT不需要Azure標誌。該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()

引用自:https://serverfault.com/questions/1003418