Summary
The current App Service deployment pipeline follows this flow:
Build Docker image → Push to Azure Container Registry (ACR) → Deploy container to App Service
Azure App Service natively supports all runtimes used in this project:
| Service |
Runtime |
App Service Runtime |
| Node.js services |
Node.js 20 |
NODE|20-lts |
| Python services |
Python 3.12 |
PYTHON|3.12 |
| .NET services |
.NET 8 |
DOTNETCORE|8.0 |
| Java services |
Java 21 / Spring Boot |
JAVA|21-java21 |
This raises the question: should we switch to native runtime (zip) deployment using az webapp deploy, eliminating the Docker/ACR dependency entirely?
Potential Benefits
- Simpler pipeline — No Docker build step, no ACR, no image push
- Lower cost — ACR has a monthly fee; native deployment has none
- Faster deployments — Zip deploy is significantly faster than building and pushing container images
- No Docker on CI agents — Reduces CI/CD agent requirements
- Managed runtime patching — App Service handles OS and runtime security patches automatically
Trade-offs to Assess
- Environment parity — Docker gives identical environments locally and in Azure. Native runtime relies on App Service's managed runtime, which may differ subtly from local
- Custom startup complexity — Some services have non-trivial startup configuration (gunicorn workers, dumb-init, multi-stage builds) that's cleanly expressed in Dockerfiles but would need App Service startup command strings instead
- Polyglot consistency — With 4 different runtimes, containers provide one uniform deployment mechanism; native runtime requires runtime-specific handling per technology
- Rollback — ACR stores tagged images enabling precise rollback; zip deploy rollback is less straightforward
- Dependency control — Dockerfiles pin exact dependency versions; native runtime inherits whatever App Service provides for that runtime version
Recommendation to Evaluate
A hybrid approach may be optimal:
- Frontend UIs (customer-ui, admin-ui) — Static React builds are ideal for zip deploy or Azure Static Web Apps; no reason to run a container
- Backend services — Keep containers for environment parity and startup control, or switch to native if simplicity is the priority
Related
- Current deployment scripts:
infrastructure/azure/app-service/bash/services/
- Common deployment function:
deploy_service_full in services/_common.sh
Summary
The current App Service deployment pipeline follows this flow:
Azure App Service natively supports all runtimes used in this project:
NODE|20-ltsPYTHON|3.12DOTNETCORE|8.0JAVA|21-java21This raises the question: should we switch to native runtime (zip) deployment using
az webapp deploy, eliminating the Docker/ACR dependency entirely?Potential Benefits
Trade-offs to Assess
Recommendation to Evaluate
A hybrid approach may be optimal:
Related
infrastructure/azure/app-service/bash/services/deploy_service_fullinservices/_common.sh