Recipe: Container Registry in .NET Apps on Azure Container Apps¶
Deploy ASP.NET Core images from private ACR using a user-assigned managed identity for image pulls.
flowchart TD
ACR[Azure Container Registry] --> APP[ASP.NET Core Container App]
APP -.-> UAMI[User-Assigned Managed Identity]
UAMI -.-> ENTRA[Microsoft Entra ID]
style APP fill:#107c10,color:#fff Prerequisites¶
- Container Apps environment (
$ENVIRONMENT_NAME) and app name ($APP_NAME) - Resource group (
$RG), region ($LOCATION), registry ($ACR_NAME) - Azure CLI with Container Apps extension and Docker
Create registry and identity for image pull¶
az acr create \
--name "$ACR_NAME" \
--resource-group "$RG" \
--location "$LOCATION" \
--sku Standard
az identity create \
--name "id-$APP_NAME" \
--resource-group "$RG" \
--location "$LOCATION"
export UAMI_ID=$(az identity show --name "id-$APP_NAME" --resource-group "$RG" --query id --output tsv)
export UAMI_PRINCIPAL_ID=$(az identity show --name "id-$APP_NAME" --resource-group "$RG" --query principalId --output tsv)
export ACR_ID=$(az acr show --name "$ACR_NAME" --resource-group "$RG" --query id --output tsv)
az role assignment create \
--assignee-object-id "$UAMI_PRINCIPAL_ID" \
--assignee-principal-type ServicePrincipal \
--role "AcrPull" \
--scope "$ACR_ID"
Multi-stage Dockerfile for ASP.NET Core 8¶
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet restore
RUN dotnet publish --configuration Release --output /app/publish
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApi.dll"]
az acr login --name "$ACR_NAME"
docker build --file Dockerfile --tag "$ACR_NAME.azurecr.io/dotnet-api:latest" .
docker push "$ACR_NAME.azurecr.io/dotnet-api:latest"
Configure Container Apps to pull from ACR¶
az containerapp create \
--name "$APP_NAME" \
--resource-group "$RG" \
--environment "$ENVIRONMENT_NAME" \
--image "$ACR_NAME.azurecr.io/dotnet-api:latest" \
--registry-server "$ACR_NAME.azurecr.io" \
--registry-identity "$UAMI_ID" \
--user-assigned "$UAMI_ID" \
--ingress external \
--target-port 8080
Advanced Topics¶
- Use immutable image tags per build and map revisions to release versions.
- Add container vulnerability scanning before push.
- Validate new revisions at 0% traffic before promotion.