
看到這個結果,我們終於有進展了!URL 和 USERNAME 已經成功進去了,這證明 「檔案寫入法」 有效地解決了 Shell 解析的問題。
但是,DOCKER_REGISTRY_SERVER_PASSWORD 依然是 null。
這是一個非常經典的 Azure App Service 「安全特性」,而不是 Bug:
1. 為什麼是 null?(真相大白)
在 Azure 中,某些特定的連線字串或敏感 Key(如 ACR 密碼)在透過 list 指令查詢時,基於安全性考量,有時會被遮蔽或不顯示。神奇的是有些密碼會顯示, 有些又不顯示.
不過,你的狀況更像是該值根本沒有寫入成功,原因通常是:
密碼太長或包含特殊字元。即便用了 JSON,如果編碼格式不是純 UTF-8(無 BOM),Azure CLI 讀取該特定長欄位時仍可能失敗。
2. 終極暴力破解:直接在指令中完成
既然變數和檔案都有鬼,我們直接用 「環境變數傳遞法」。請在 PowerShell 執行這段「一條龍」指令:
PowerShell
# 直接把密碼塞進變數,並強迫用最原始的方式寫入
$RAW_PWD = "your-pwd"
az webapp config appsettings set `
--name "app-pr-stg-jpe" `
--resource-group "rg-pr-stg-jpe-001" `
--settings "DOCKER_REGISTRY_SERVER_PASSWORD=$($RAW_PWD)"
3. 如果還是 null,請改用 Portal 確認
如果執行完上面的指令,回傳的 JSON 裡 value 還是 null,請不要理會 CLI 的輸出,直接去瀏覽器看:
- 登入 Azure Portal。
- 找到你的 Web App
app-pr-stg-jpe。 - 左側選單點擊 Environment variables (或是舊版的 Configuration)。
- 在 App settings 標籤下,找到
DOCKER_REGISTRY_SERVER_PASSWORD。 - 點擊右邊的小眼睛(Show value)。
如果 Portal 裡有值,那就代表寫入成功了,單純是 CLI 顯示不出來。
4. 方案 B:換一個 Key 測試
如果連 Portal 都是空的,請試試看寫入一個「非標準名稱」的 Key,測試是否是長度限制:
PowerShell
az webapp config appsettings set `
--name "app-pr-stg-jpe" `
--resource-group "rg-pr-stg-jpe-001" `
--settings MY_TEST_PWD="your-pwd"
- 如果
MY_TEST_PWD有值,但DOCKER_..._PASSWORD沒值,那就是 Azure 對特定 Key 的保護機制。 - 如果
MY_TEST_PWD也是null,那就是你的 Token 權限雖然能發起請求,但無權寫入敏感字串(雖然這機率極低)。
請先試試第 2 步,然後直接去 Portal 確認!那是唯一的真理。
恭喜!既然 Portal 裡有值,那就代表你的設定已經成功寫入 Azure 底層資料庫了。
你剛剛經歷的是 Azure CLI 在特定環境下常見的「視覺欺騙」現象。
為什麼 CLI 一直顯示 null?
這通常不是你的錯,而是以下幾個因素造成的:
- 敏感資訊保護 (Masking):Azure CLI 為了防止密碼在終端機日誌(Logs)中以明文留下,有時會在回傳的 JSON 結果中將特定敏感名稱(如包含
PASSWORD或SECRET的 Key)強制顯示為null,即便寫入是成功的。 - 非同步快取 (Cache Delay):當你執行
set指令時,CLI 會立即回傳一個狀態。有時這個回傳結果是從本地快取或近端節點抓取的,而資料還沒完全從後台同步回來,導致顯示為空。 - 32-bit 轉 64-bit 的殘留行為:雖然你更新了 CLI,但某些設定檔(如
~/.azure/config)可能還殘留舊的解析偏好。
下一步:驗證 Web App 是否能抓到 ACR 映像檔
既然 App Settings 已經在 Portal 存好了,你的 Web App 現在應該具備拉取 Docker Image 的權限了。你可以執行以下指令來觸發重新啟動並檢查容器狀態:
PowerShell
# 強制 Web App 重新啟動以套用新設定
az webapp restart --name "app-pr-stg-jpe" --resource-group "rg-pr-stg-jpe-001"
# 觀察 Container 的啟動日誌(看有沒有 Login Succeeded)
az webapp log tail --name "app-pr-stg-jpe" --resource-group "rg-pr-stg-jpe-001"
💡 小建議
既然你現在不是 Owner,之後如果遇到類似的「靈異 null」,永遠以 Portal 的顯示為準。
如果你未來需要在 Script 中抓取這個值(而不是只靠眼睛看),可以試著在 list 指令後加上 --include-show-all(如果版本支援)或改用:
az webapp config appsettings list --name "app-pr-stg-jpe" -g "rg-pr-stg-jpe-001"
但通常只要 Portal 有,你的應用程式(Python/Node/FastAPI)就一定讀得到 $DOCKER_REGISTRY_SERVER_PASSWORD。
既然這關過了,接下來是要準備 Push 映像檔,還是要設定 CI/CD Pipeline 呢?
az webapp config appsettings list --name "app-pr-stg-jpe" -g "rg-pr-stg-jpe-001"
[
{
"name": "DOCKER_REGISTRY_SERVER_PASSWORD",
"slotSetting": false,
"value": null
},
{
"name": "DOCKER_REGISTRY_SERVER_URL",
"slotSetting": false,
"value": "https://arcprstgjpe001.azurecr.io"
},
{
"name": "DOCKER_REGISTRY_SERVER_USERNAME",
"slotSetting": false,
"value": "arcprstgjpe001"
}
]
