Azure App Service is a service used to create and deploy scalable, mission-critical web apps.
Hello Emmanuel !
Thank you for posting on MS Learn Q&A.
I saw that you had some feedback so I will add my assumptions that were not mentioned above.
The curl -v https://<acr>.azurecr.io/v2/ result does not necessarily prove a failure. A 401 Unauthorized from /v2/ is expected when no Docker/ACR bearer token is provided. It means the app reached the ACR endpoint and ACR challenged for authentication. Kudu curl does not automatically use the Web App managed identity.
The more important point is that the hostname appears to resolve to a public ACR IP (20.x.x.x). If the ACR is meant to be accessed through Private Endpoint, from the Web App/Kudu console the ACR FQDN should resolve to the private endpoint IP. I would first validate DNS:
nslookup <acr-name>.azurecr.io
nslookup <acr-name>.<region>.data.azurecr.io
If it resolves publicly, link the privatelink.azurecr.io private DNS zone to the VNet used by the Web App VNet integration or configure the custom DNS forwarder correctly. ACR private endpoint requires DNS records for the registry endpoint and data endpoint.
For the actual image pull, also verify that the Web App is explicitly configured to use managed identity for ACR and that image pull traffic is routed through the VNet:
az webapp config set \
--resource-group <rg> \
--name <app-name> \
--generic-configurations '{"acrUseManagedIdentityCreds": true}'
az resource update \
--resource-group <rg> \
--name <app-name> \
--resource-type "Microsoft.Web/sites" \
--set properties.outboundVnetRouting.imagePullTraffic=true
The managed identity must have AcrPull on the registry, and for a network-protected registry App Service also needs VNet integration, private endpoint DNS resolution, and image-pull-over-VNet enabled.
I have a concern about the VNet integration subnet it looks very small and App Service VNet integration requires at least /28 for an existing subnet and it is recommended to use /26 to avoid issues during scale operations or platform upgrades. A /29 subnet with only a couple of free IPs can cause unstable behavior.