مكتبة عميل Azure Container Registry ل Python - الإصدار 1.2.0

يسمح لك Azure Container Registry بتخزين صور الحاوية والبيانات الاصطناعية وإدارتها في سجل خاص لجميع أنواع عمليات نشر الحاوية.

استخدام مكتبة العميل سجل حاويات Azure من أجل:

  • وضع قائمة بالصور أو الأجزاء الاصطناعية في سجل
  • الحصول على بيانات التعريف للصور والبيانات الاصطناعية والمستودعات والعلامات
  • تعيين خصائص القراءة/الكتابة/الحذف في عناصر التسجيل
  • حذف الصور والبيانات الاصطناعية والمستودعات والعلامات

التعليمات البرمجية | المصدرحزمة (Pypi) | حزمة (Conda) | الوثائق | المرجعية لواجهة برمجة التطبيقاتوثائق | واجهة برمجة تطبيقات RESTوثائق المنتج

إخلاء المسئولية

انتهى دعم حزم Azure SDK Python ل Python 2.7 في 01 يناير 2022. لمزيد من المعلومات والأسئلة، يرجى الرجوع إلى https://github.com/Azure/azure-sdk-for-python/issues/20691Python 3.7 أو أحدث مطلوب لاستخدام هذه الحزمة. لمزيد من التفاصيل، يرجى الرجوع إلى Azure SDK لنهج دعم إصدار Python.

الشروع في العمل

تثبيت الحِزَمة

تثبيت مكتبة عميل تسجيل حاوية Azure لـ.NET مع NuGet:

pip install --pre azure-containerregistry

المتطلبات الأساسية

لإنشاء سجل حاوية جديد، يمكنك استخدام مدخل Microsoft Azure أو Azure PowerShell أو Azure CLI. وفيما يلي مثال باستخدام واجهة سطر الأوامر لـ Azure :

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

مصادقة العميل

توفر مكتبة Azure Identity دعما سهلا ل Azure Active Directory للمصادقة. DefaultAzureCredential يفترض تعيين متغيرات AZURE_CLIENT_IDAZURE_TENANT_IDالبيئة و وAZURE_CLIENT_SECRET، لمزيد من المعلومات، راجع قسم متغيرات بيئة هوية Azure

# 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 Artifacts. تتكون الصورة أو الجزء الاصطناعي من بيانوطبقات. يصف بيان الصورة الطبقات التي تشكل الصورة، ويتم تحديدها بشكل فريد من خلال ملخصها. يمكن أيضا "وضع علامة" على الصورة لإعطائها اسما مستعارا يمكن للبشر قراءته. يمكن أن تحتوي الصورة أو البيانات الاصطناعية على صفر أو أكثر من العلامات المرتبطة بها، وتحدد كل علامة الصورة بشكل فريد. يشار إلى مجموعة من الصور التي تشترك في نفس الاسم ولكن لها علامات مختلفة، كمستودع.

لمزيد من المعلومات، يرجى مراجعة مفاهيم سجل الحاوية.

أمثلة

توفر الأقسام التالية العديد من القصاصات البرمجية التي تغطي بعض مهام خدمة 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)

حذف كائن ثنائي كبير الحجم

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-core التكوينات المتوفرة لإعادة المحاولة والتسجيل وبروتوكولات النقل والمزيد.

الخطوات التالية

المساهمة

هذا المشروع يرحب بالمساهمات والاقتراحات. معظم المساهمات تتطلب منك الموافقة على اتفاقية ترخيص المساهم (CLA) التي تعلن أن لديك الحق في منحنا حق استخدام مساهمتك. للحصول على التفاصيل، تفضل بزيارة cla.microsoft.com.

اعتمد هذا المشروع مدونة السلوك من المصادر المفتوحة من Microsoft. لمزيد من المعلومات، راجع الأسئلة المتداولة حول قواعد السلوك أو الاتصال opencode@microsoft.com بأي أسئلة أو تعليقات إضافية.

مرات الظهور