azure cli 的 server password 鬼打牆體驗

看到這個結果,我們終於有進展了!URLUSERNAME 已經成功進去了,這證明 「檔案寫入法」 有效地解決了 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 的輸出,直接去瀏覽器看

  1. 登入 Azure Portal
  2. 找到你的 Web App app-pr-stg-jpe
  3. 左側選單點擊 Environment variables (或是舊版的 Configuration)。
  4. App settings 標籤下,找到 DOCKER_REGISTRY_SERVER_PASSWORD
  5. 點擊右邊的小眼睛(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 結果中將特定敏感名稱(如包含 PASSWORDSECRET 的 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"
  }
]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *