共用方式為


無法將映像從 Azure Container Registry 提取至 Azure Web 應用程式

本文提供將映像從 Azure 容器登錄提取至 Azure Web 應用程式時可能遇到的最常見錯誤的疑難解答指引。

徵兆和初始疑難解答

建議您藉由檢查 容器登錄健全狀況來啟動疑難解答。

若要檢查容器登錄健全狀況,請執行下列命令:

az acr check-health --name <myregistry> --ignore-errors --yes

如果偵測到問題,結果會包含錯誤碼和描述。 如需這些錯誤和可能解決方案的詳細資訊,請參閱 健康情況檢查錯誤參考

注意

如果您收到 Helm 相關或 Notary 相關錯誤,這並不表示您的 Container Registry 或 AKS 無法運作或發生問題。 它只會指出 Helm 或 Notary 未安裝,或 Azure CLI 與目前安裝的 Helm 或 Notary 版本不相容等問題。

接下來,找出需要疑難解答的提取相關錯誤訊息:

  1. 登入 Azure 入口網站
  2. 在您的 Web 應用程式中,選取 [部署中心>記錄]。 選取認可以檢視記錄詳細數據。 您也可以在 [監視] 區段中檢查記錄數據流,以實時檢視映射提取程序的記錄。

下列各節可協助您針對 Web 應用程式記錄中顯示的最常見錯誤進行疑難解答。

錯誤 1:未經授權

Head \" https://<acr-name>.azurecr.io/v2/<repository>/manifests/<tag>\": unauthorized

系統管理使用者型驗證的解決方案

「未經授權」錯誤可能是由不正確的系統管理員認證所造成。 這包括您在 Web 應用程式環境變數中設定的登入伺服器、使用者名稱或密碼。

若要解決此問題,請執行下列步驟:

  1. Azure 入口網站 中,流覽至您的登錄容器。 在 [ 設定] 區段中,選取 [ 存取金鑰]。 檢查登入伺服器使用者名稱和密碼管理員使用者認證設定。
  2. 流覽至您的 Web 應用程式。 在 [設定] 區段中,選取 [環境變數]。
  3. 請確定為容器登錄設定的三個變數(登入伺服器、使用者名稱、密碼)符合登錄容器中的管理員使用者認證設定。

受控識別型驗證的解決方案

當您使用 Azure Web 應用程式的受控識別型驗證時, Microsoft.ContainerRegistry/registries/pull/read 必須將許可權指派給受控識別,才能執行提取動作。

包含許可權的 Microsoft.ContainerRegistry/registries/pull/read Azure 內建角色如下:

  • AcrPull
  • AcrPush
  • ReaderContributor
  • 擁有者

如需詳細資訊,請參閱 Azure Container Registry 角色和權限

當您從容器登錄起始提取作業時,AcrPull 角色會自動指派給 Azure Web 應用程式受控識別。 您不需要手動新增許可權。 不過,您必須確定不會封鎖角色指派建立,例如 Azure 原則。 此外,請確認角色指派並未刪除。

錯誤 2:找不到標記標記的<>指令清單

DockerApiException : Docker API responded with status code=NotFound, response={"message":"manifest for <acr-name>.azurecr.io/<repository>:<tag> not found: manifest unknown: manifest tagged by \"<tag>\" is not found"}

解決方案:請確定標籤存在

錯誤訊息指出找不到與您嘗試提取之映像相關聯的標記。 請確定標記存在於相關聯的存放庫和登錄內。

若要使用 Azure CLI 在相關聯的存放庫和登錄內尋找標籤,請執行下列命令:

az acr repository show-tags -n <ContainerRegistryName> --repository <RepositoryName>

若要使用 Azure 入口網站 來尋找相關聯存放庫和登錄內的標籤,請遵循下列步驟:

流覽至您的登錄容器。 在 [服務] 底下,選取 [存放庫],開啟相關聯的存放庫,然後檢查卷標清單。

注意

az acr repository show-tags 命令,或檢查來自 Azure 入口網站 的存放庫只有在容器登錄網路規則允許時才能運作。

錯誤 3:不允許具有 IP 的用戶端存取

DockerApiException: Docker API responded with status code=InternalServerError, response={"message":"Head \"https:// <acr-name>.azurecr.io/v2/<repository>/manifests/<tag>\": denied: client with IP '<web-app-outbound-ip>' is not allowed access. Refer https://aka.ms/acr/firewall to grant access."}

解決方案 1:確定容器登錄內建防火牆允許裝置的 IP 位址

根據預設,容器登錄會接受來自所有網路的因特網連線。 容器登錄具有內建防火牆,可限制特定IP位址或 CIDR 的存取,或完全停用公用網路存取。

如果容器登錄的內建防火牆封鎖 Web 應用程式的 IP 位址,就會發生此問題。

若要解決此問題,請確定內建防火牆允許必須提取映像之 Web 應用程式的輸出 IP 位址。

若要尋找 Web 應用程式的輸出 IP 位址,請遵循下列步驟:

  1. Azure 入口網站 中,流覽至您的 Web 應用程式。
  2. 在 [概 觀] 頁面上,找出 [輸出 IP 位址],然後選取 [ 顯示更多] 以取得輸出 IP 位址的完整清單

若要使用 Azure CLI 尋找 Web 應用程式的輸出 IP 位址,請參閱在 Azure App 服務 中尋找輸出 IP 位址。

解決方案 2:設定 Web 應用程式的虛擬網路整合

如果您必須完全停用公用網路存取,或只允許容器登錄中選取的網路,而不需手動新增 Web 應用程式的 IP 位址,替代選項就是私下提取映像。 若要私下提取映像,您必須 使用私人端點 來設定容器登錄,並 啟用 Web 應用程式的虛擬網路整合。

您可以遵循下列步驟,在 Web 應用程式端設定虛擬網路整合:

  1. Azure 入口網站 中,流覽至您的 Web 應用程式,然後選取 [網络]。

  2. 在 [輸出流量設定] 下,設定 虛擬網絡 整合,選取 [新增虛擬網络整合],然後指定訂用帳戶、虛擬網路和子網。

  3. 在 [ 虛擬網络組態 ] 頁面上,確定 已選取 [容器映射提取 ] 選項。

    容器映像提取選項的螢幕快照。

若要透過虛擬網路提取映像,您必須在 Web 應用程式的部署中心啟用透過 VNet 的提取映像。 此外,如果容器登錄已停用公用存取或設定為特定網路,您可能會收到「無法載入 ACR 標籤 - 失敗」訊息,如下列範例所示。 此案例預期會發生該錯誤。 如果發生這種情況,就無法使用 ImageTag下拉式清單選項。 您必須手動輸入影像和標籤。

無法載入 ACR 標記錯誤訊息的螢幕快照。

下一步

如果此疑難解答指引無法解決問題,請考慮下列事項:

檢查與您的子網相關聯的網路安全組和路由表。 如果虛擬設備,例如防火牆,控制子網之間的流量,請檢閱防火牆及其存取規則。

使用 Kudu 服務進行其他疑難解答。 您可以連線到 Kudu 服務。 例如,使用 Bash 執行 來測試 DNS 解析 nslookup <acr-name>.azurecr.io,或使用 檢查連線能力 tcpping <acr-name>.azurecr.io

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。