Azure App Service 失敗的除錯

Docker Desktop 裡的 Image 部署到 Azure App Service, localhost 測試無誤, 但開啟 URL 就顯示:

:( Application Error
If you are the application administrator, you can access the diagnostic resources.

在本地(localhost)運行正常但在 Azure App Service 失敗,通常是因為環境差異(如環境變數、連接埠設定)或權限問題導致的。

這是一套系統化的除錯流程,幫助你快速定位問題:


1. 檢查容器日誌 (最直接的方法)

Azure App Service 提供即時日誌串流,你可以看到容器啟動失敗的具體原因(例如:缺少環境變數、資料庫連線超時)。

  • Log Stream: 在 Azure Portal 進入你的 App Service,左側選單找到 Monitoring > Log Stream
  • Deployment Center: 在 Deployment Center > Logs 標籤頁中,可以看到映像檔抓取(Pull)與啟動的記錄。

2. 確認連接埠 (Port) 設定

這是最常見的錯誤原因。Docker 預設可能監聽 80 或 8080,但 Azure 需要知道該往哪個 Port 傳送流量。

  • WEBSITES_PORT: 如果你的容器監聽的不是 80,請在 Configuration > Application settings 中新增一個設定:
    • WEBSITES_PORT = 你的容器內部的 Port (例如 30005000)。
  • 注意: 不要更動 EXPOSE 指令,Azure 主要依賴此環境變數來進行 Port Forwarding。

3. 使用 SSH 直接進入容器

如果容器已經啟動但行為異常,你可以直接「進去」看檔案或測試連線:

  • 在 Portal 左側找到 Development Tools > SSH
  • 進入後,你可以執行 ls 檢查檔案,或使用 curl localhost:port 測試內部服務是否存活。

4. 檢查環境變數與連線字串

本地端測試時,你可能使用了 .env 檔案或本地資料庫,但雲端環境不同。

  • 資料庫連線: 確保 Azure 的防火牆(例如 Azure SQL 或 MongoDB)已允許該 App Service 的 IP 存取。
  • App Settings: 確保所有必要的 API Key、DB_URL 都已在 Azure Portal 的 Configuration 中設定。

5. 常見錯誤情境對照表

錯誤現象可能原因解決方案
Container terminated on startup啟動指令錯誤或缺少環境變數檢查 Log Stream 的 Stack Trace
Wait for response from container timed out容器啟動太慢或 Port 沒對上設定 WEBSITES_PORT 或增加 WEBSITES_CONTAINER_START_TIME_LIMIT (最高 1800)
502 Bad Gateway容器崩潰或 Nginx 設定錯誤檢查應用程式內部日誌
403 Forbidden容器存取權限或 IP 限制檢查 App Service 的 Networking 限制

6. 本地模擬雲端測試 (Best Practice)

為了排除是 Azure 的問題還是 Docker 封裝的問題,請在本地執行以下指令測試:

Bash

# 移除所有本地快取,模擬全新環境
docker run -e WEBSITES_PORT=8080 -p 8080:8080 <你的影像名稱>

提示: 觀察容器是否能在完全不依賴本地檔案(如未掛載 Volume)的情況下啟動。


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *