共用方式為


適用于 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

必要條件

若要建立新的 Container Registry,您可以使用Azure入口網站、Azure PowerShellAzure CLI。 以下是使用 Azure CLI 的範例:

az acr create --name MyContainerRegistry --resource-group MyResourceGroup --location westus --sku Basic

驗證用戶端

Azure 身分識別程式庫提供簡單的 Azure Active Directory 驗證支援。 假設已設定 、 AZURE_TENANT_IDAZURE_CLIENT_SECRET 環境變數,如需詳細資訊,請參閱Azure 身分識別環境變數一節AZURE_CLIENT_IDDefaultAzureCredential

# 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 核心 參考檔 說明重試、記錄、傳輸通訊協定等可用的組態。

下一步

參與

此專案歡迎參與和提供建議。 大部分的參與都要求您同意「參與者授權合約 (CLA)」,宣告您有權且確實授與我們使用投稿的權利。 如需詳細資訊,請造訪 cla.microsoft.com

此專案採用 Microsoft Open Source Code of Conduct (Microsoft 開放原始碼管理辦法)。 如需詳細資訊,請參閱管理辦法常見問題集,如有任何其他問題或意見請連絡 opencode@microsoft.com

曝光數