[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-83c104e2-e3b4-4bae-ab57-38a2e2f85a87":3,"$fWOEhDvWiZDAtsSbhVkbrfE0L1dEJR7-d0BP_bgsB0wo":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"83c104e2-e3b4-4bae-ab57-38a2e2f85a87","azure-containerregistry-py","Azure容器注册表Python SDK。用于管理容器镜像、工件和仓库。","cat_coding_devops","mod_coding","sickn33,coding","---\nname: azure-containerregistry-py\ndescription: Azure Container Registry SDK for Python. Use for managing container images, artifacts, and repositories.\nrisk: unknown\nsource: community\ndate_added: '2026-02-27'\n---\n\n# Azure Container Registry SDK for Python\n\nManage container images, artifacts, and repositories in Azure Container Registry.\n\n## Installation\n\n```bash\npip install azure-containerregistry\n```\n\n## Environment Variables\n\n```bash\nAZURE_CONTAINERREGISTRY_ENDPOINT=https:\u002F\u002F\u003Cregistry-name>.azurecr.io\n```\n\n## Authentication\n\n### Entra ID (Recommended)\n\n```python\nfrom azure.containerregistry import ContainerRegistryClient\nfrom azure.identity import DefaultAzureCredential\n\nclient = ContainerRegistryClient(\n    endpoint=os.environ[\"AZURE_CONTAINERREGISTRY_ENDPOINT\"],\n    credential=DefaultAzureCredential()\n)\n```\n\n### Anonymous Access (Public Registry)\n\n```python\nfrom azure.containerregistry import ContainerRegistryClient\n\nclient = ContainerRegistryClient(\n    endpoint=\"https:\u002F\u002Fmcr.microsoft.com\",\n    credential=None,\n    audience=\"https:\u002F\u002Fmcr.microsoft.com\"\n)\n```\n\n## List Repositories\n\n```python\nclient = ContainerRegistryClient(endpoint, DefaultAzureCredential())\n\nfor repository in client.list_repository_names():\n    print(repository)\n```\n\n## Repository Operations\n\n### Get Repository Properties\n\n```python\nproperties = client.get_repository_properties(\"my-image\")\nprint(f\"Created: {properties.created_on}\")\nprint(f\"Modified: {properties.last_updated_on}\")\nprint(f\"Manifests: {properties.manifest_count}\")\nprint(f\"Tags: {properties.tag_count}\")\n```\n\n### Update Repository Properties\n\n```python\nfrom azure.containerregistry import RepositoryProperties\n\nclient.update_repository_properties(\n    \"my-image\",\n    properties=RepositoryProperties(\n        can_delete=False,\n        can_write=False\n    )\n)\n```\n\n### Delete Repository\n\n```python\nclient.delete_repository(\"my-image\")\n```\n\n## List Tags\n\n```python\nfor tag in client.list_tag_properties(\"my-image\"):\n    print(f\"{tag.name}: {tag.created_on}\")\n```\n\n### Filter by Order\n\n```python\nfrom azure.containerregistry import ArtifactTagOrder\n\n# Most recent first\nfor tag in client.list_tag_properties(\n    \"my-image\",\n    order_by=ArtifactTagOrder.LAST_UPDATED_ON_DESCENDING\n):\n    print(f\"{tag.name}: {tag.last_updated_on}\")\n```\n\n## Manifest Operations\n\n### List Manifests\n\n```python\nfrom azure.containerregistry import ArtifactManifestOrder\n\nfor manifest in client.list_manifest_properties(\n    \"my-image\",\n    order_by=ArtifactManifestOrder.LAST_UPDATED_ON_DESCENDING\n):\n    print(f\"Digest: {manifest.digest}\")\n    print(f\"Tags: {manifest.tags}\")\n    print(f\"Size: {manifest.size_in_bytes}\")\n```\n\n### Get Manifest Properties\n\n```python\nmanifest = client.get_manifest_properties(\"my-image\", \"latest\")\nprint(f\"Digest: {manifest.digest}\")\nprint(f\"Architecture: {manifest.architecture}\")\nprint(f\"OS: {manifest.operating_system}\")\n```\n\n### Update Manifest Properties\n\n```python\nfrom azure.containerregistry import ArtifactManifestProperties\n\nclient.update_manifest_properties(\n    \"my-image\",\n    \"latest\",\n    properties=ArtifactManifestProperties(\n        can_delete=False,\n        can_write=False\n    )\n)\n```\n\n### Delete Manifest\n\n```python\n# Delete by digest\nclient.delete_manifest(\"my-image\", \"sha256:abc123...\")\n\n# Delete by tag\nmanifest = client.get_manifest_properties(\"my-image\", \"old-tag\")\nclient.delete_manifest(\"my-image\", manifest.digest)\n```\n\n## Tag Operations\n\n### Get Tag Properties\n\n```python\ntag = client.get_tag_properties(\"my-image\", \"latest\")\nprint(f\"Digest: {tag.digest}\")\nprint(f\"Created: {tag.created_on}\")\n```\n\n### Delete Tag\n\n```python\nclient.delete_tag(\"my-image\", \"old-tag\")\n```\n\n## Upload and Download Artifacts\n\n```python\nfrom azure.containerregistry import ContainerRegistryClient\n\nclient = ContainerRegistryClient(endpoint, DefaultAzureCredential())\n\n# Download manifest\nmanifest = client.download_manifest(\"my-image\", \"latest\")\nprint(f\"Media type: {manifest.media_type}\")\nprint(f\"Digest: {manifest.digest}\")\n\n# Download blob\nblob = client.download_blob(\"my-image\", \"sha256:abc123...\")\nwith open(\"layer.tar.gz\", \"wb\") as f:\n    for chunk in blob:\n        f.write(chunk)\n```\n\n## Async Client\n\n```python\nfrom azure.containerregistry.aio import ContainerRegistryClient\nfrom azure.identity.aio import DefaultAzureCredential\n\nasync def list_repos():\n    credential = DefaultAzureCredential()\n    client = ContainerRegistryClient(endpoint, credential)\n    \n    async for repo in client.list_repository_names():\n        print(repo)\n    \n    await client.close()\n    await credential.close()\n```\n\n## Clean Up Old Images\n\n```python\nfrom datetime import datetime, timedelta, timezone\n\ncutoff = datetime.now(timezone.utc) - timedelta(days=30)\n\nfor manifest in client.list_manifest_properties(\"my-image\"):\n    if manifest.last_updated_on \u003C cutoff and not manifest.tags:\n        print(f\"Deleting {manifest.digest}\")\n        client.delete_manifest(\"my-image\", manifest.digest)\n```\n\n## Client Operations\n\n| Operation | Description |\n|-----------|-------------|\n| `list_repository_names` | List all repositories |\n| `get_repository_properties` | Get repository metadata |\n| `delete_repository` | Delete repository and all images |\n| `list_tag_properties` | List tags in repository |\n| `get_tag_properties` | Get tag metadata |\n| `delete_tag` | Delete specific tag |\n| `list_manifest_properties` | List manifests in repository |\n| `get_manifest_properties` | Get manifest metadata |\n| `delete_manifest` | Delete manifest by digest |\n| `download_manifest` | Download manifest content |\n| `download_blob` | Download layer blob |\n\n## Best Practices\n\n1. **Use Entra ID** for authentication in production\n2. **Delete by digest** not tag to avoid orphaned images\n3. **Lock production images** with can_delete=False\n4. **Clean up untagged manifests** regularly\n5. **Use async client** for high-throughput operations\n6. **Order by last_updated** to find recent\u002Fold images\n7. **Check manifest.tags** before deleting to avoid removing tagged images\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,228,1190,"2026-05-16 13:06:03",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"DevOps","devops","mdi-cog-outline","CI\u002FCD、容器化、部署运维",3,162,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"38f8c2fd-6221-454f-845e-8542e41e6278","1.0.0","azure-containerregistry-py.zip",2049,"uploads\u002Fskills\u002F83c104e2-e3b4-4bae-ab57-38a2e2f85a87\u002Fazure-containerregistry-py.zip","aba5718f2c34115e52a4ab007629345d0fae4f8226ff02be741a3bc0a3d05a5f","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":6440}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]