2025/01/24

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

前言

因為新專案要求要用 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 工具:

步驟: (參考: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 過農曆年前解掉這一個部署環節,可以好好過年囉!祝蛇來運轉~