Skip to content

Evaluate replacing Docker/ACR deployment with native App Service runtime deployment #2

Description

@prasadhonrao

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions