適用于 Python 的 Azure Container Registry 用戶端程式庫 - 1.2.0 版
Azure Container Registry可讓您針對所有類型的容器部署,在私人登錄中儲存和管理容器映射和成品。
使用 Azure Container Registry 的用戶端程式庫來:
- 列出登錄中的映像或成品
- 取得影像和成品、存放庫和標記的中繼資料
- 在登錄項目上設定讀取/寫入/刪除屬性
- 刪除映射和成品、存放庫和標記
| 原始程式碼套件 (Pypi) | 封裝 (Conda) | API 參考檔 | REST API 檔 | 產品檔
免責聲明
Python 2.7 的 Azure SDK Python 套件支援已于 2022 年 1 月 1 日結束。 如需詳細資訊和問題,請參閱 https://github.com/Azure/azure-sdk-for-python/issues/20691Python 3.7 或更新版本,才能使用此套件。如需詳細資訊,請參閱適用于 Python 的 Azure SDK 版本支援原則。
開始使用
安裝套件
使用 pip 安裝適用於 Python 的 Azure Container Registry 用戶端程式庫:
pip install --pre azure-containerregistry
必要條件
- 需要 Python 3.7 或更新版本才能使用此套件。
- 您需要 Azure 訂 用 帳戶和 Container Registry 帳戶 才能使用此套件。
若要建立新的 Container Registry,您可以使用Azure入口網站、Azure PowerShell或Azure CLI。 以下是使用 Azure CLI 的範例:
az acr create --name MyContainerRegistry --resource-group MyResourceGroup --location westus --sku Basic
驗證用戶端
Azure 身分識別程式庫提供簡單的 Azure Active Directory 驗證支援。 假設已設定 、 AZURE_TENANT_ID
和 AZURE_CLIENT_SECRET
環境變數,如需詳細資訊,請參閱Azure 身分識別環境變數一節AZURE_CLIENT_ID
DefaultAzureCredential
# Create a ContainerRegistryClient that will authenticate through Active Directory
from azure.containerregistry import ContainerRegistryClient
from azure.identity import DefaultAzureCredential
endpoint = "https://mycontainerregistry.azurecr.io"
audience = "https://management.azure.com"
client = ContainerRegistryClient(endpoint, DefaultAzureCredential(), audience=audience)
重要概念
登錄會儲存 Docker 映射和OCI 成品。 映像或成品是由資訊清單和圖層所組成。 影像的資訊清單描述組成影像的圖層,而且是由其 摘要唯一識別。 影像也可以「標記」,讓它成為人類可讀取的別名。 影像或成品可以有零或多個與其相關聯的 標記 ,而且每個標記都會唯一識別影像。 共用相同名稱但具有不同標籤的映射集合稱為存放 庫。
如需詳細資訊,請參閱 Container Registry 概念。
範例
下列各節提供數個程式碼片段,涵蓋一些最常見的 ACR 服務工作,包括:
請注意,每個範例假設有一個 CONTAINERREGISTRY_ENDPOINT
環境變數設定為字串,其中包含 https://
前置詞和登入伺服器的名稱,例如 「 https://myregistry.azurecr.io" ;。 匿名存取範例會從環境變數 CONTAINERREGISTRY_ANONREGISTRY_ENDPOINT
取得端點值。
列出儲存機制
逐一查看登錄中的存放庫集合。
with ContainerRegistryClient(self.endpoint, self.credential) as client:
# Iterate through all the repositories
for repository_name in client.list_repository_names():
print(repository_name)
列出具有匿名存取權的標籤
使用匿名存取逐一查看存放庫中的標記集合。
with ContainerRegistryClient(endpoint) as anon_client:
manifest = anon_client.get_manifest_properties("library/hello-world", "latest")
print(f"Tags of {manifest.repository_name}: ")
# Iterate through all the tags
for tag in manifest.tags:
print(tag)
設定成品屬性
設定成品的屬性。
with ContainerRegistryClient(self.endpoint, self.credential) as client:
# Set permissions on image "library/hello-world:v1"
client.update_manifest_properties(
"library/hello-world",
"v1",
can_write=False,
can_delete=False
)
刪除映像
刪除儲存機制中前三個之前的映射。
with ContainerRegistryClient(self.endpoint, self.credential) as client:
for repository in client.list_repository_names():
# Keep the three most recent images, delete everything else
manifest_count = 0
for manifest in client.list_manifest_properties(
repository, order_by=ArtifactManifestOrder.LAST_UPDATED_ON_DESCENDING
):
manifest_count += 1
if manifest_count > 3:
# Make sure will have the permission to delete the manifest later
client.update_manifest_properties(
repository,
manifest.digest,
can_write=True,
can_delete=True
)
print(f"Deleting {repository}:{manifest.digest}")
client.delete_manifest(repository, manifest.digest)
上傳影像
若要上傳完整的映射,我們需要上傳個別的圖層和組態。 之後,我們可以上傳描述影像或成品的資訊清單,並將它指派標記。
self.repository_name = "sample-oci-image"
layer = BytesIO(b"Sample layer")
config = BytesIO(json.dumps(
{
"sample config": "content",
}).encode())
with ContainerRegistryClient(self.endpoint, self.credential) as client:
# Upload a layer
layer_digest, layer_size = client.upload_blob(self.repository_name, layer)
print(f"Uploaded layer: digest - {layer_digest}, size - {layer_size}")
# Upload a config
config_digest, config_size = client.upload_blob(self.repository_name, config)
print(f"Uploaded config: digest - {config_digest}, size - {config_size}")
# Create an oci image with config and layer info
oci_manifest = {
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": config_digest,
"sizeInBytes": config_size,
},
"schemaVersion": 2,
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar",
"digest": layer_digest,
"size": layer_size,
"annotations": {
"org.opencontainers.image.ref.name": "artifact.txt",
},
},
],
}
# Set the image with tag "latest"
manifest_digest = client.set_manifest(self.repository_name, oci_manifest, tag="latest")
print(f"Uploaded manifest: digest - {manifest_digest}")
下載影像
若要下載完整的映射,我們需要下載其資訊清單,然後下載個別的層和組態。
with ContainerRegistryClient(self.endpoint, self.credential) as client:
# Get the image
get_manifest_result = client.get_manifest(self.repository_name, "latest")
received_manifest = get_manifest_result.manifest
print(f"Got manifest:\n{received_manifest}")
# Download and write out the layers
for layer in received_manifest["layers"]:
# Remove the "sha256:" prefix from digest
layer_file_name = layer["digest"].split(":")[1]
try:
stream = client.download_blob(self.repository_name, layer["digest"])
with open(layer_file_name, "wb") as layer_file:
for chunk in stream:
layer_file.write(chunk)
except DigestValidationError:
print(f"Downloaded layer digest value did not match. Deleting file {layer_file_name}.")
os.remove(layer_file_name)
print(f"Got layer: {layer_file_name}")
# Download and write out the config
config_file_name = "config.json"
try:
stream = client.download_blob(self.repository_name, received_manifest["config"]["digest"])
with open(config_file_name, "wb") as config_file:
for chunk in stream:
config_file.write(chunk)
except DigestValidationError:
print(f"Downloaded config digest value did not match. Deleting file {config_file_name}.")
os.remove(config_file_name)
print(f"Got config: {config_file_name}")
刪除資訊清單
with ContainerRegistryClient(self.endpoint, self.credential) as client:
get_manifest_result = client.get_manifest(self.repository_name, "latest")
# Delete the image
client.delete_manifest(self.repository_name, get_manifest_result.digest)
刪除 Blob
with ContainerRegistryClient(self.endpoint, self.credential) as client:
get_manifest_result = client.get_manifest(self.repository_name, "latest")
received_manifest = get_manifest_result.manifest
# Delete the layers
for layer in received_manifest["layers"]:
client.delete_blob(self.repository_name, layer["digest"])
# Delete the config
client.delete_blob(self.repository_name, received_manifest["config"]["digest"])
疑難排解
如需疑難排解的相關資訊,請參閱 疑難排解指南。
一般
ACR 用戶端程式庫會引發 Azure Core中定義的例外狀況。
記錄
此程式庫會使用標準記錄程式庫進行 記錄 。
HTTP 會話的基本資訊 (URL、標頭等。) 會在層級記錄 INFO
。
詳細的 DEBUG
層級記錄,包括要求/回應主體和 未回應 標頭,可以在用戶端或每個作業 logging_enable
上使用 關鍵字引數來啟用。
如需完整的 SDK 記錄檔,請參閱 這裡的範例。
選用組態
選擇性關鍵字引數可以在用戶端和每個作業層級傳入。 azure 核心 參考檔 說明重試、記錄、傳輸通訊協定等可用的組態。
下一步
- 進一步瞭解 azure.containerregistry 和我們的 範例。
- 觀看 示範或深入探討影片。
- 深入瞭解Azure Container Registry服務。
參與
此專案歡迎參與和提供建議。 大部分的參與都要求您同意「參與者授權合約 (CLA)」,宣告您有權且確實授與我們使用投稿的權利。 如需詳細資訊,請造訪 cla.microsoft.com。
此專案採用 Microsoft Open Source Code of Conduct (Microsoft 開放原始碼管理辦法)。 如需詳細資訊,請參閱管理辦法常見問題集,如有任何其他問題或意見請連絡 opencode@microsoft.com。