2025/01/24

[Azure] ASP.NET Core 專案部署到 Web App for Containers 問題除錯心得

markdown ### 前言 因為新專案要求要用 Docker,本地開發端的問題通常不大,開專案也都有 Template,往往都是實際要部署上線時會遇到一些狀況。 趁著記憶猶新,整理一下部署心得 ### 開發環境 - Windows 11 - Docker Desktop v4.37.1 - Visual Studio 2022 (v17.11.x -- 原版本忘了,因部署 Bug 問題,後來升級到 v17.12.4) - ASP.NET Core Web App (Model-View-Controller) 專案 - .NET 8.0 ### 選擇部署到 Azure 的服務 將專案部署到 Azure 上,我選擇的服務如下: - Azure Container Registry (ACR) - Azure App Service (Web App for Containers) - Azure SQL Database - Azure Storage ### 問題 1: 在 Visual Studio 執行發佈要將 Docker Image 部署至 ACR 時發生問題 錯誤訊息:Container prerequisites were missing. (說是 Docker 裡的 settings.json 找不到) 怎麼第一步就卡關了? 先說結論:因為 Docker Desktop 版本有異動,造成 Visual Studio 特定版本部署會出問題,更新 Visual Studio 就能解決 (參考:Cannot publish to Docker Registry using Docker Desktop v4.36 settings.json is not found) ### 問題 2: 在工具出問題時,只好轉戰手動模式 -- 打指令 下指令前需要以下 CLI 工具: - 備妥 Azure CLI (How to install the Azure CLI) - 備妥 Docker CLI (在 Windows 安裝 Docker Desktop 就包含了) 步驟: (參考:Tutorial: Create an Azure container registry and push a container image) 註:ACR 的服務我是先在 Azure Portal 上操作建立的,以及參考了網上許多內容而來,試錯過程跳過。 最終我的步驟如下: 1. 登入 Azure 2. 登入 Azure Container Registry 3. 準備要發佈的 Docker Image 上 tag 4. 發佈 Docker Image 到 ACR
在執行 `az login` 又是第一步噴錯,訊息是 "No subscriptions found",被要求用 `az login --tenant TENANT_ID` 指令,以前沒用指令登入,不知道是從什麼時候改的,如果最近有遇到的朋友們,就改加 --tenant 的指定方式登入吧 (TENANT_ID 請到 Azure Portal 去查詢 `目錄識別碼`) (參考:Sign into Azure interactively using the Azure CLI) ``` az login --tenant TENANT_ID ``` 登入 ACR 的帳號及密碼,請到 Azure 上取得管理者資料 (容器登錄:設定/存取金鑰,記得勾管理使用者,以取得登入密碼) ``` docker login xxx.azurecr.io ``` 到了第三步準備發佈的 Docker Image,這應該是沒工具幫助下我被卡住的地方,一開始是用開發版的那一個 Image 做發佈,結果在 Web App 那邊一直卡關出不來,後來是更新完 Visual Studio 版本成功發佈後,才知道 dev 及 latest 是有差異的 aspnetapp 是 image tag 名稱,再依自己需求變更 ``` docker build -t aspnetapp . docker tag IMAGE_ID xxx.azurecr.io/aspnetapp ``` 最後是發佈 Image 到 ACR ``` docker push xxx.azurecr.io/aspnetapp ``` 在執行手動模式跟用 Visual Studio 發佈來說,操作工具真的是快多了,不過這一波試錯過程我也學到如何不透過工具手動發佈啦。 ### 問題 3: 在建立 Web App for Containers 後,出現 `ERROR - Container didn't respond to HTTP pings on port: 8080` 這一關卡最久,一來是上面發佈 Image 的步驟出現問題,二來是 .NET 8 的 Dockerfile 做了 port 的變更從對應 80 變 8080 參考:.NET 8 / Contianers / Default ASP.NET Core port changed from 80 to 8080 所以在 Azure App Service 需要設定 `WEBSITES_PORT` 環境變數為 8080 ### 結論 發佈網站到 Azure,單純看部署的步驟真的很簡單,工具的整合若是順利的話也很容易。但是,就是這個但是,Breaking Change 很常會讓人卡關。 教學文件跨版本跨平台就會有些許不同,而這些許不同也許就會耗上開發者不少的除錯時間。 Blog 記錄該做的還是要記下來,以免未來的自己需要被拯救。 好吧~ 2025 過農曆年前解掉這一個部署環節,可以好好過年囉!祝蛇來運轉~

沒有留言: