Azure
Azure:Docker 應用程序錯誤“…站點未在預期時間限制內啟動”和“容器 X 未響應埠 80 上的 HTTP ping”
我有一個 Flask Python 應用程序,它通過 Gunicorn 從 Docker Linux 容器執行。在 Ubuntu 上執行 Docker 容器在本地執行良好,但是當容器被推送到 Azure 容器系統資料庫然後部署為 Azure 應用程序時,它會失敗並顯示以下錯誤消息:
- 站點 my-app 的容器 my-app_900f4c 未在預期時間限制內啟動。
- 容器 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()