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 過農曆年前解掉這一個部署環節,可以好好過年囉!祝蛇來運轉~
沒有留言:
張貼留言