Azure Container Registry CLI
GitHubOfficialFirst committed by AClerboisDistributed by GitHub
- Skill
- Tool integration
- Cloud and DevOps
- MIT
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The azure-container-registry-cli skill provides a comprehensive interface for interacting with Azure Container Registry (ACR) via the Azure CLI. It covers the full lifecycle of container registries, including creation, authentication, image management, cloud-based builds, and automated tasks. The skill emphasizes server-side operations like importing images and cloud builds to reduce local dependencies and improve efficiency in CI/CD pipelines.
What it does
- Create and manage Azure Container Registry instances and configurations.
- Authenticate local environments or services against registries.
- Execute cloud-based container image builds without requiring a local daemon.
- Automate image workflows using ACR Tasks with git, base-image, or timer triggers.
- Perform server-side image operations such as importing and purging.
- Manage registry security through RBAC roles, repository-scoped tokens, and network rules.
When to use it
- When you need to build, push, or import container images directly within Azure.
- When setting up automated image rebuilds or multi-step tasks.
- When configuring registry access for CI/CD systems or Azure compute services.
- When managing registry lifecycle, geo-replication, or network security settings.
- When diagnosing connectivity or quota issues with a registry.
Advantages
- Reduces local resource usage by offloading builds and image transfers to the cloud.
- Integrates natively with Azure identity and access management systems.
- Supports complex automation workflows through ACR Tasks.
- Provides server-side tools for efficient image maintenance and cleanup.
Usage examples
- “How do I build an image in the cloud using my current directory?”
- The agent will provide the az acr build command, specifying the registry and image name to trigger a cloud-based build.
- “How can I grant a service principal pull access to my registry?”
- The agent will explain how to use az role assignment create with the AcrPull role scoped to the registry ID.
- “Show me how to list all tags for a specific repository.”
- The agent will provide the az acr repository show-tags command to display tags for the requested repository.
- “How do I set up a nightly rebuild task for my application?”
- The agent will guide you through creating an ACR task and adding a timer trigger using az acr task timer add.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/github/azure-container-registry-cli/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip azure-container-registry-cli.zip -d .agents/skills
Documentation by AClerbois
Azure Container Registry CLI
Manage Azure Container Registry (ACR) resources using the az acr command group of the Azure CLI.
CLI: az acr ships with core Azure CLI — no extension required (the acrtransfer extension is only needed for export/import pipelines).
Prerequisites
# Install Azure CLI
brew install azure-cli # macOS
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash # Linux
winget install Microsoft.AzureCLI # Windows
# Sign in and select subscription
az login
az account set --subscription {subscription-id}Quick Start
# Create a registry (SKU: Basic | Standard | Premium)
az acr create --resource-group {rg} --name {registry} --sku Standard
# Authenticate Docker/Podman against the registry
az acr login --name {registry}
# Build and push in the cloud — no local Docker needed
az acr build --registry {registry} --image app:v1 .
# Copy an image from another registry without pull/push
az acr import --name {registry} --source mcr.microsoft.com/hello-world:latest
# List repositories and tags
az acr repository list --name {registry} --output table
az acr repository show-tags --name {registry} --repository app --orderby time_desc
# Diagnose registry connectivity and configuration
az acr check-health --name {registry} --yesKey Principles
Prefer
az acr build/ ACR Tasks over localdocker build+docker push: builds run in Azure, work without a local daemon, and integrate with triggers.Prefer
az acr importto move images between registries: it is server-side, faster, and requires no local storage.Never enable the admin user for production — use Microsoft Entra identities (RBAC roles
AcrPull/AcrPush, orContainer Registry Repository Reader/Writeron ABAC-enabled registries), repository-scoped tokens, or managed identities.Premium-only features: geo-replication, private endpoints, retention policies, connected registries, agent pools. (Repository-scoped tokens work in all tiers; zone redundancy is automatic in all tiers in supported regions.)
CLI Structure
az acr
├── create / delete / list / show / update # Registry lifecycle
├── login # Docker credential helper (or --expose-token)
├── check-health / check-name / show-usage # Diagnostics & quota
├── build # Cloud image build (quick task)
├── run # Run a command / multi-step task once
├── task # ACR Tasks (triggers, timers, logs, runs)
├── agentpool # Dedicated task agent pools (Premium)
├── import # Server-side image copy into the registry
├── repository # List/show/delete/untag repos & tags, lock images
├── manifest # Manifest metadata, delete, OCI referrers
├── credential # Admin user credentials (avoid in production)
├── token / scope-map # Repository-scoped tokens (Premium)
├── replication # Geo-replication (Premium)
├── network-rule # IP network rules
├── private-endpoint-connection # Private Link approvals
├── config # content-trust, retention, soft-delete, ...
├── cache / credential-set # Artifact cache (pull-through cache) rules
├── webhook # Push/delete event webhooks
├── connected-registry # On-premises / IoT connected registries
└── export-pipeline / import-pipeline / pipeline-run # acrtransfer extensionReference Files
Read the relevant reference file based on the user's task. Each file contains complete command syntax and examples for its domain.
| File | When to read | Covers |
|---|---|---|
references/auth-and-security.md | Login failures, permissions, CI/CD or AKS pull access | az acr login (incl. --expose-token), Entra RBAC roles, service principals, managed identities, --attach-acr for AKS, repository-scoped tokens & scope maps, admin user, content trust |
references/build-and-tasks.md | Building images in Azure, automation, CI triggers | az acr build, az acr run, multi-step task YAML, az acr task (git/base-image/timer triggers, logs, runs), agent pools |
references/images-and-artifacts.md | Managing repos, tags, cleanup, storage costs | az acr import, repository & manifest commands, untag vs delete, purge (acr purge), image locking, retention policy, soft delete, artifact cache, show-usage |
references/networking-and-geo.md | Multi-region, private access, edge scenarios | Geo-replication, zone redundancy, private endpoints, network rules, dedicated data endpoints, connected registries, registry transfer pipelines |
Files
- ATTRIBUTION.mdAdded by AutoGineer891 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md5.0 KiB
- references/auth-and-security.md7.5 KiB
- references/build-and-tasks.md6.0 KiB
- references/images-and-artifacts.md6.4 KiB
- references/networking-and-geo.md6.8 KiB
references/auth-and-security.md
Authentication & Security
Table of Contents
Individual Login
Microsoft Entra RBAC Roles
Service Principals
Managed Identities
AKS Integration
Repository-Scoped Tokens
Admin User
Content Trust
Individual Login
# Standard login — wires Docker/Podman credentials via your az login identity
az acr login --name {registry}
# Without a Docker daemon: get an Entra access token and pipe it to docker login
LOGIN_SERVER=$(az acr show --name {registry} --query loginServer --output tsv)
az acr login --name {registry} --expose-token --query accessToken --output tsv | \
docker login $LOGIN_SERVER --username 00000000-0000-0000-0000-000000000000 --password-stdinNotes:
az acr logintokens are valid for 3 hours; re-run on expiry.Resolve the login server with
az acr show --name {registry} --query loginServer --output tsvrather than hardcoding it: it is usually{registry}.azurecr.io, but sovereign clouds use other suffixes and registries with a domain name label scope get a hash suffix.
Microsoft Entra RBAC Roles
The applicable data-plane roles depend on the registry's role assignment permissions mode — check it first:
az acr show --name {registry} --query roleAssignmentMode --output tsv
# LegacyRegistryPermissions -> use AcrPull/AcrPush/AcrDelete
# AbacRepositoryPermissions -> use Container Registry Repository Reader/Writer/ContributorLegacy mode (RBAC Registry Permissions):
| Role | Permissions |
|---|---|
AcrPull | Pull images |
AcrPush | Pull + push images |
AcrDelete | Delete images |
AcrImageSigner | Sign images (content trust) |
Contributor/Owner | Full control-plane management + push/pull |
ABAC-enabled mode (RBAC Registry + ABAC Repository Permissions): AcrPull/AcrPush/AcrDelete are not honored, and Owner/Contributor/Reader grant control-plane only. Use instead:
| Role | Permissions |
|---|---|
Container Registry Repository Reader | Read images, tags, metadata (add ABAC conditions to scope to repositories) |
Container Registry Repository Writer | Read + write/update |
Container Registry Repository Contributor | Read + write + delete |
Container Registry Repository Catalog Lister | List repositories — assign only when the identity must enumerate the catalog (e.g., az acr repository list); not needed for pull/push of known repositories |
# Get the registry resource ID
ACR_ID=$(az acr show --name {registry} --query id --output tsv)
# Grant pull access to a user, group, service principal, or managed identity
az role assignment create --assignee {principal-id} --scope $ACR_ID --role AcrPull
# List who has access
az role assignment list --scope $ACR_ID --output tableService Principals
For CI/CD systems that cannot use OIDC/managed identity:
# Create an SP scoped to pull only
ACR_ID=$(az acr show --name {registry} --query id --output tsv)
az ad sp create-for-rbac --name {sp-name} --scopes $ACR_ID --role AcrPull
# Docker login with the SP — pipe the secret via stdin, never pass it as an argument
# (printf with a quoted variable preserves whitespace/glob characters exactly)
printf '%s' "$SP_PASSWORD" | docker login $LOGIN_SERVER --username {appId} --password-stdinPrefer federated credentials (OIDC) over SP passwords in GitHub Actions / Azure DevOps when possible.
Managed Identities
For Azure compute (VM, App Service, Container Apps, Functions):
# Assign a system-assigned identity and grant it pull
az vm identity assign --name {vm} --resource-group {rg}
PRINCIPAL_ID=$(az vm show --name {vm} --resource-group {rg} --query identity.principalId --output tsv)
az role assignment create --assignee $PRINCIPAL_ID --scope $ACR_ID --role AcrPullApp Service / Container Apps then pull with --assign-identity + --acr-identity style flags of their own CLIs — no registry password needed.
AKS Integration
# Attach at cluster creation
az aks create --name {cluster} --resource-group {rg} --attach-acr {registry}
# Attach/detach an existing cluster (grants AcrPull to the kubelet identity)
az aks update --name {cluster} --resource-group {rg} --attach-acr {registry}
az aks update --name {cluster} --resource-group {rg} --detach-acr {registry}
# Validate the cluster can reach the registry
az aks check-acr --name {cluster} --resource-group {rg} --acr {registry}.azurecr.io--attach-acr requires Owner or User Access Administrator on the registry. Cross-subscription attach works by passing the full ACR resource ID.
⚠️ --attach-acr assigns AcrPull, which is not honored on ABAC-enabled registries (roleAssignmentMode = AbacRepositoryPermissions). For those, assign the ABAC roles to the kubelet identity manually:
ACR_ID=$(az acr show --name {registry} --query id --output tsv)
KUBELET_ID=$(az aks show --name {cluster} --resource-group {rg} \
--query identityProfile.kubeletidentity.objectId --output tsv)
az role assignment create --assignee $KUBELET_ID --scope $ACR_ID \
--role "Container Registry Repository Reader"
# "Container Registry Repository Catalog Lister" is NOT needed for pulls —
# only add it if the identity must list repositoriesRepository-Scoped Tokens
Available in all service tiers. Fine-grained, non-Entra credentials (e.g., external partners, IoT devices):
# 1. Create a scope map (actions: content/read, content/write, content/delete, metadata/read, metadata/write)
az acr scope-map create --name {scope-map} --registry {registry} \
--repository app content/read metadata/read \
--description "Pull-only access to app"
# 2. Create a token bound to the scope map
az acr token create --name {token} --registry {registry} --scope-map {scope-map}
# 3. Generate/rotate passwords (up to 2, optional expiry)
az acr token credential generate --name {token} --registry {registry} --password1 --expiration-in-days 30
# Login with the token — pipe the password via stdin, never pass it as an argument
printf '%s' "$TOKEN_PWD" | docker login $LOGIN_SERVER --username {token} --password-stdin
# Disable or delete
az acr token update --name {token} --registry {registry} --status disabled
az acr token delete --name {token} --registry {registry} --yesAdmin User
Single account, full push/pull on the whole registry, not auditable per user — keep disabled in production:
az acr update --name {registry} --admin-enabled false # recommended
az acr credential show --name {registry} # view username/passwords (if enabled)
az acr credential renew --name {registry} --password-name password2 # rotateLegitimate uses: quick local tests, services that only accept username/password and cannot use tokens.
Content Trust (deprecated)
Docker Content Trust (DCT) is being retired: since May 31, 2026 it cannot be enabled on new registries (or on registries that never enabled it), and it will be removed entirely on March 31, 2028. Do not set up DCT — sign images with Notation (Notary Project) and store signatures as OCI artifacts instead; see "Transition from Docker Content Trust to Notary Project" in the ACR docs.
# Registries with legacy DCT only — inspect or disable the existing configuration
az acr config content-trust show --registry {registry}
az acr config content-trust update --registry {registry} --status disabledLegacy DCT signers needed AcrImageSigner in addition to AcrPush.
Requirements and compatibility
Written for: GitHub Copilot
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs network access, Needs a command-line tool
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- First committed by
AClerbois
- Publisher
- GitHub (Official)
- Distributed by
- GitHub
- Source
- github/awesome-copilot · skills/azure-container-registry-cli · commit 797337f
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- AClerbois
AutoGineer is not affiliated with or endorsed by AClerbois or GitHub.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download azure-container-registry-cli.zip