本文說明 Azure Container Registry 的常見問題和已知問題。
如需登錄的疑難排解指引,請參閱:
資源管理
是否可以使用 Resource Manager 範本在 Azure Stack Hub 上建立 Azure Container Registry?
是。 以下是可用來建立登錄的範本 。 此範本適用於 Azure 公用雲端。 若要針對 Azure Stack Hub 使用此範本,請將 API 版本修改為 2019-05-01,否則無法部署。
Azure Stack Hub 上的 Azure Container Registry 是否有映射的安全性弱點掃描?
否。 Azure Stack Hub 上部署的登錄目前沒有與 Azure 資訊安全中心 整合。 有第三方和 開放原始碼 選項可用來填補連線或中斷連線 Azure Stack Hub 部署的需求。
如何使用 Azure Container Registry 設定 Kubernetes?
請參閱 Kubernetes 的文件和 Azure Kubernetes Service 的步驟。
如何取得容器登錄的系統管理員認證?
重要
管理使用者帳戶是專為讓單一使用者存取登錄而設計,主要用於測試。 不建議與多個使用者共享系統管理員帳戶認證。 針對遠端控制案例的使用者和服務主體,建議使用個人身分識別。 請參閱 AD 驗證概觀。
取得系統管理員認證之前,請確定已啟用登錄的系統管理員使用者。
若要使用 Azure CLI 取得認證:
az acr credential show -n myRegistry
使用 Azure PowerShell:
Invoke-AzureRmResourceAction -Action listCredentials -ResourceType Microsoft.ContainerRegistry/registries -ResourceGroupName myResourceGroup -ResourceName myRegistry
如何取得 Resource Manager 範本中的管理員認證?
重要
管理使用者帳戶是專為讓單一使用者存取登錄而設計,主要用於測試。 不建議與多個使用者共享系統管理員帳戶認證。 針對遠端控制案例的使用者和服務主體,建議使用個人身分識別。 請參閱 AD 驗證概觀。
取得系統管理員認證之前,請確定已啟用登錄的系統管理員使用者。
若要取得第一個密碼:
{
"password": "[listCredentials(resourceId('Microsoft.ContainerRegistry/registries', 'myRegistry'), '2017-10-01').passwords[0].value]"
}
若要取得第二個密碼:
{
"password": "[listCredentials(resourceId('Microsoft.ContainerRegistry/registries', 'myRegistry'), '2017-10-01').passwords[1].value]"
}
如何? 將 Azure Container Registry 中的容器映像推送至執行 Kubernetes 的已中斷連線的 Azure Stack Hub 部署?
您可以從已經有所需容器映像的機器,透過局域網路執行機器對機器映射傳輸。 若要這樣做:
首先,使用具有因特網連線能力的計算機,使用 docker CLI 和 docker pull 命令擷取必要的容器映像。 如需詳細資訊,請參閱 將容器映射匯入容器登錄 。
匯入必要的映像之後,將機器傳輸至已中斷連線的 Azure Hub 實例位置。
使用 docker 標籤和 docker push 命令,將映射標記並推送至 Azure Stack Hub 存放庫上的本機 Azure Container Registry。
登錄作業
如何存取 Docker Registry HTTP API V2?
Azure Container Registry 支援 Docker Registry HTTP API V2。 可以在 https://<your registry login server>/v2/
存取 API。 範例: https://mycontainerregistry.azsacr.<regionname>.<fqdn>/v2/
如何? 刪除存放庫中任何標籤未參考的所有指令清單?
如果您在 Bash 上:
az acr manifest list-metadata --name myRepository --registry myRegistry --query "[?tags[0]==null].digest" --output tsv | xargs -I% az acr repository delete --name myRegistry --image myRepository@%
如果是 PowerShell:
az acr manifest list-metadata --name myRepository --registry myRegistry --query "[?tags[0]==null].digest" --output tsv | %{ az acr repository delete --name myRegistry --image myRepository@$_ }
注意
您可以在 delete 命令中新增 --yes
,以略過確認。
如需詳細資訊,請參閱刪除 Azure Container Registry 中的容器映像。
為何在刪除映像之後,登錄配額使用量不會降低?
如果基礎層仍被其他容器映像參考,就可能發生這種情況。 如果您刪除沒有參考的映像,登錄使用會在幾分鐘內更新。
如何驗證儲存體配額變更?
使用下列 Docker 檔案,建立具有 1GB 圖層的映像。 這可確保映像具有登錄中任何其他映射未共享的層次。
FROM alpine
RUN dd if=/dev/urandom of=1GB.bin bs=32M count=32
RUN ls -lh 1GB.bin
使用 Docker CLI 建立映像並將其推送至您的登錄。
docker build -t myregistry.azsacr.<regionname>.<fqdn>/1gb:latest .
docker push myregistry.azsacr.<regionname>.<fqdn>/1gb:latest
您應該可以看到記憶體使用量已在 Azure Stack Hub 入口網站中增加,或者您可以使用 CLI 查詢使用量。
az acr show-usage -n myregistry
使用 Azure CLI 或入口網站刪除映像,並在幾分鐘內檢查已更新的使用方式。
az acr repository delete -n myregistry --image 1gb
在容器中執行 CLI 時,如何向我的登錄進行驗證?
您需要掛接 Docker 通訊端來執行 Azure CLI 容器:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock azuresdk/azure-cli-python:dev
在容器中,安裝 docker
:
apk --update add docker
然後使用您的登錄進行驗證:
az acr login -n MyRegistry
如何啟用 TLS 1.2?
使用任何最近的 Docker 用戶端 (18.03.0 版和更新版本) 來啟用 TLS 1.2。
重要
從 2020 年 1 月 13 日開始,Azure Container Registry 將要求所有安全連線來自伺服器和應用程式,才能使用 TLS 1.2。 TLS 1.0 和 1.1 的支援將會淘汰。
Azure Stack Hub 上的 Azure Container Registry 是否支持內容信任?
否,Azure Stack Hub 上目前版本的 Azure Container Registry 僅支援「標準」SKU,且不支持內容信任。
如何授與提取或推送映像的存取權,但不授與管理登錄資源的權限?
Azure Container Registry 支援 提供不同許可權層級的自定義角色 。 具體而言,AcrPull
和 AcrPush
角色可讓使用者提取和/或推送映像,而不需要在 Azure 中管理登錄資源。
Azure Stack Hub 入口網站:您的登錄 -> 存取控制 (IAM) -> 新增 (選取
AcrPull
或AcrPush
角色)。Azure CLI:執行下列命令來尋找登錄的資源識別碼:
az acr show -n myRegistry
接著,您可以將
AcrPull
或AcrPush
角色指派給使用者 (下列範例會使用AcrPull
):az role assignment create --scope resource_id --role AcrPull --assignee user@example.com
或者,將角色指派給其應用程式識別碼所識別的服務主體:
az role assignment create --scope resource_id --role AcrPull --assignee 00000000-0000-0000-0000-000000000000
然後,該受託人就能夠驗證和存取登錄中的映像。
若要向登錄進行驗證:
az acr login -n myRegistry
若要列出存放庫:
az acr repository list -n myRegistry
若要提取映像:
docker pull myregistry.azsacr.<regionname>.<fqdn>/hello-world
只要使用 AcrPull
或 AcrPush
角色,則受託人就沒有在 Azure 中管理登錄資源的權限。 例如,az acr list
或 az acr show -n myRegistry
不會顯示登錄。
如何將不可散發層推送至登錄?
資訊清單中的不可散發層包含可從中擷取內容的 URL 參數。 下列是啟用不可散發層推播的一些可能使用案例:網路受限登錄、具有限制存取的網路隔絕登錄,或是沒有網際網路連線的登錄。
舉例來說,如果您已設定 NSG 規則讓 VM 只能從 Azure 容器登錄提取映像,則 Docker 對外部/不可散發層會提取失敗。 舉例來說,如果 Windows Server Core 映像在其資訊清單中包含 Azure 容器登錄的外部層參考,則在此案例中會提取失敗。
若要啟用不可散發層的推送:
編輯
daemon.json
檔案,其位於 Linux 主機中的/etc/docker/
和 Windows Server 中的C:\ProgramData\docker\config\daemon.json
。 假設檔案之前是空的,請新增下列內容:{ "allow-nondistributable-artifacts": ["myregistry.azsacr.<regionname>.<fqdn>"] }
注意
值是登錄位址的陣列,以逗號分隔。
儲存並結束檔案。
重新啟動 Docker。
當將映像推送至清單中的登錄時,即會將其不可散發層推送至登錄。
警告
不可散發的成品通常在其可散發和共用的方式及位置上均有限制。 這項功能只能用來將成品推送至私人登錄。 務必遵循在轉散發不可散發成品時涉及的任何條款。
診斷和健康情況檢查
使用 ' az acr check-health ' 檢查健康情況
若要針對常見的環境和登錄問題進行疑難排解,請參閱檢查 Azure 容器登錄的健全狀況。
Docker 提取失敗,並出現錯誤:net/http:在等候連接時取消要求 (等待標題時超過 Client.Timeout)
- 如果此錯誤是暫時性的問題,則重試將會成功。
- 如果
docker pull
持續失敗,則 Docker 精靈可能發生問題。 重新啟動 Docker 精靈通常可以減輕問題。 - 如果您在重新啟動 Docker 精靈之後繼續看到此問題,則問題可能是電腦的網路連線問題。 若要檢查電腦上的一般網路是否狀況良好,請執行下列命令來測試端點連線能力。 包含此連線檢查命令的最低
az acr
版本為 2.2.9。 如果您使用的是較舊的版本,請升級您的 Azure CLI。
az acr check-health -n myRegistry
- 在所有 Docker 用戶端操作上都應該一律有重試機制。
Docker pull 的速度很慢
使用 此工具 測試您的電腦網路下載速度。
Docker push 的速度很慢
使用 此工具 測試您的電腦網路上傳速度。
Docker push 成功,但 docker pull 失敗,發生錯誤:未經授權:需要驗證
此錯誤可能會發生在 Red Hat 版本的 Docker 精靈上,其中 --signature-verification
預設為啟用。 您可以執行下列命令來檢查 Red Hat Enterprise Linux (RHEL) 或 Fedora 的 Docker 精靈選項:
grep OPTIONS /etc/sysconfig/docker
例如,Fedora 28 伺服器具有下列 Docker 精靈選項:
OPTIONS='--selinux-enabled --log-driver=journald --live-restore'
由於 --signature-verification=false
遺失,docker pull
會失敗並出現類似以下的錯誤:
Trying to pull repository myregistry.azsacr.<regionname>.<fqdn>/myimage ...
unauthorized: authentication required
若要解決此錯誤:
將選項
--signature-verification=false
新增至 Docker 精靈 設定檔/etc/sysconfig/docker
。 例如:OPTIONS='--selinux-enabled --log-driver=journald --live-restore --signature-verification=false'
執行下列命令來重新啟動 Docker 精靈服務:
sudo systemctl restart docker.service
可以找到 --signature-verification
的詳細資料,方法為執行 man dockerd
。
az acr login 成功,但 Docker 失敗,發生錯誤為:未經授權:需要驗證
即使登錄資源名稱為大寫或混合大小寫,例如 myRegistry
,請確定您使用的是所有小寫伺服器 URL,例如 docker push myregistry.azsacr.<regionname>.<fqdn>/myimage:latest
。
啟用並取得 Docker 精靈的偵錯工具記錄檔
使用 [debug
] 選項啟動 dockerd
。 首先,建立 Docker 精靈設定檔 (/etc/docker/daemon.json
) (如果不存在),然後新增 debug
選項:
{
"debug": true
}
然後,重新啟動精靈。 例如,使用 Ubuntu 14.04:
sudo service docker restart
如需詳細資料,請參閱 Docker文件。
視您的系統而定,可能會在不同的位置產生記錄。 例如,針對 Ubuntu 14.04,則為
/var/log/upstart/docker.log
。
如需詳細資料,請參閱 Docker 文件。針對適用於 Windows 的 Docker,記錄檔會在 %LOCALAPPDATA%/docker/ 之下產生。 不過,它可能尚未包含所有的偵錯資訊。
若要存取完整的背景程式記錄檔,您可能需要一些額外的步驟:
docker run --privileged -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/local/bin/docker:/usr/local/bin/docker alpine sh docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh chroot /host
現在您可以存取執行
dockerd
的 VM 中所有的檔案。 記錄檔位於/var/log/docker.log
。
新的使用者權限在更新之後可能不會立即生效
您將新的權限 (新角色) 授與服務主體時,變更可能不會立即生效。 可能有二個原因:
Microsoft Entra 角色指派延遲。 一般來說速度很快,但可能由於散佈延遲而需要幾分鐘的時間。
Azure Container Registry 令牌伺服器上的許可權延遲。 這最多可能需要 10 分鐘的時間。 若要減輕問題,您可以
docker logout
,然後在 1 分鐘後再以相同的使用者進行驗證:docker logout myregistry.azsacr.<regionname>.<fqdn> docker login myregistry.azsacr.<regionname>.<fqdn>
直接 REST API 呼叫上未以正確的格式提供驗證資訊
您可能會遇到 InvalidAuthenticationInfo
錯誤,特別是使用 curl
工具搭配選項 -L
、--location
(以遵循重新導向)。
例如,使用 curl
搭配 -L
選項和基本驗證來提取 Blob:
curl -L -H "Authorization: basic $credential" https://$registry.azurecr.io/v2/$repository/blobs/$digest
可能會出現下列回應:
<?xml version="1.0" encoding="utf-8"?>
<Error><Code>InvalidAuthenticationInfo</Code><Message>Authentication information is not given in the correct format. Check the value of Authorization header.
RequestId:00000000-0000-0000-0000-000000000000
Time:2019-01-01T00:00:00.0000000Z</Message></Error>
根本原因是某些 curl
的實施會遵循從原始要求的標題重新導向。
若要解決這個問題,您需要以手動方式追蹤不含標題的重新導向。 使用 curl
的 -D -
選項來列印回應標題,然後解壓縮:Location
標題:
redirect_url=$(curl -s -D - -H "Authorization: basic $credential" https://$registry.azurecr.io/v2/$repository/blobs/$digest | grep "^Location: " | cut -d " " -f2 | tr -d '\r')
curl $redirect_url
為什麼 Azure Stack Hub 入口網站不會列出我所有的存放庫或標籤?
如果您使用 Microsoft Edge/IE 瀏覽器,最多可以看到 100 個存放庫或標籤。 如果您的登錄有 100 個以上的存放庫或標籤,建議您使用 Firefox 或 Chrome 瀏覽器來列出所有的存放庫或標籤。
為什麼 Azure Stack Hub 入口網站無法擷取存放庫或標籤?
瀏覽器可能無法將提取存放庫或標籤的要求傳送至伺服器。 可能的原因有很多種,例如:
- 沒有網路連線
- 防火牆
- 針對只允許私人存取的登錄,透過公用網路來使用入口網站
- 廣告封鎖程式
- DNS 錯誤
請洽詢您的網路系統管理員,或檢查您的網路設定和連線能力。 請嘗試使用您的 Azure CLI 執行 az acr check-health -n yourRegistry
,以檢查您的環境是否能夠連線至容器登錄。 此外,您也可以在瀏覽器中嘗試 incognito 或私用工作階段,以避免任何過時的瀏覽器快取或 Cookie。
為什麼我的提取或推送要求失敗,且不允許作業?
以下是可能不允許作業的一些案例:
- 映像或存放庫可能已鎖定,所以無法刪除或更新。 您可以使用 az acr show repository 命令來檢視目前的屬性。
- 如果映像處於隔離中,則不允許某些作業。 深入瞭解隔離。
- 您的登錄可能已達其儲存體限制。
存放庫格式無效或不受支援
在存放庫作業中指定存放庫名稱時,如果看到「不支援的存放庫格式」、「格式無效」或「要求的資料不存在」之類的錯誤,請檢查名稱的拼字和大小寫。 有效的存放庫名稱只能包含小寫英數位元、句號、連字號、底線和正斜線。
如何在 Windows 上收集 HTTP 追蹤?
必要條件
- 在 fiddler 中啟用 https 解密: https://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/DecryptHTTPS
- 讓 Docker 透過 Docker ui 使用 Proxy: https://docs.docker.com/docker-for-windows/#proxies
- 完成時,請務必還原。 Docker 無法與已啟用且未執行 Fiddler 搭配運作。
Windows 容器
將 Docker Proxy 設定為 127.0.0.1:8888
Linux 容器
尋找 Docker VM 虛擬交換器的 IP:
(Get-NetIPAddress -InterfaceAlias "*Docker*" -AddressFamily IPv4).IPAddress
將 Docker Proxy 設定為上一個命令和連接埠 8888 的輸出 (例如 10.0.75.1:8888)
下一步
- 深入瞭解 Azure Container Registry。