
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(例如3000或5000)。
- 注意: 不要更動
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)的情況下啟動。
