/ Home

Azure Container Apps

Updated: Sep 17, 2024

How to push a local app to Docker public registry

Git repo:
https://github.com/kactlabs/simple-flask
git clone git@github.com:kactlabs/simple-flask.git


v1:

	docker build -t rj-server:v1 .
	docker run -p 9090:5000 --name rj-server-112 rj-server:v1

	http://0.0.0.0:9090/


	Push to DockerHub:

		docker build -t rj-server:v1 .

		docker tag rj-server:v1 rajacsp/rj-server:v1

		docker push rajacsp/rj-server:v1

How to pull from public Docker

docker pull rajacsp/csp-server:v1
docker run -p 9090:5000 --name csp-server-112 rajacsp/csp-server:v1
Microservice: Server:

OS env variables:
RESOURCE_GROUP="rjresroucegroup"
LOCATION="centralindia"
CONTAINERAPPS_ENVIRONMENT="rjresroucegroup-env"
CONTAINERAPPS_NAME="rj-server"
ACR_BASE="rjsimpleflask"
REPOSITORY_NAME="rj-flask-server"
SUBSCRIPTION_ID="965..00f8d0"

echo $RESOURCE_GROUP
echo $LOCATION
echo $CONTAINERAPPS_NAME
echo $REPOSITORY_NAME
v1:

	docker build -t rj-server:v1 .
	docker run -p 9090:5000 --name rj-server-112 rj-server:v1

	http://0.0.0.0:9090/


	Push to DockerHub:

		docker build -t rj-server:v1 .

		docker tag rj-server:v1 rajacsp/rj-server:v1

		docker push rajacsp/rj-server:v1


	Login to ACR:

		az login
		az acr login --name $ACR_BASE


	Push to ACR:

		docker tag rj-server:v1 rjsimpleflask.azurecr.io/rj-flask-server:v1

		docker push rjsimpleflask.azurecr.io/rj-flask-server:v1




v2:

	Push to DockerHub:

		docker build -t rj-server:v2 .

		docker tag rj-server:v2 rajacsp/rj-server:v2

		docker push rajacsp/rj-server:v2


	Login to ACR:

		az login
		az acr login --name $ACR_BASE


	Push to ACR:

		docker tag rj-server:v2 rjsimpleflask.azurecr.io/rj-flask-server:v2

		docker push rjsimpleflask.azurecr.io/rj-flask-server:v2
az login
az acr login --name $ACR_BASE

# Create Container App Environment
az containerapp env create -n $CONTAINERAPPS_ENVIRONMENT -g $RESOURCE_GROUP \
    --location $LOCATION

#
verify:
az containerapp env list --resource-group $RESOURCE_GROUP

# how to create a container app
az containerapp up \
	  --name $CONTAINERAPPS_NAME \
	  --resource-group $RESOURCE_GROUP \
	  --location $LOCATION \
	  --environment $CONTAINERAPPS_ENVIRONMENT \
	  --image $ACR_BASE.azurecr.io/$REPOSITORY_NAME:v1 \
	  --target-port 5000 \
	  --ingress external \
	  --query properties.configuration.ingress.fqdn


	# verify
	az containerapp logs show -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP --type system --tail 50

	az containerapp show -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP

# Check revision
az containerapp revision list \
  --name $CONTAINERAPPS_NAME \
  --resource-group $RESOURCE_GROUP \
  -o table



# Adding Label to the recent revision
az containerapp revision label add -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP --label v1 --revision latest

# Update existing containerapp
az containerapp update \
  --container-name $CONTAINERAPPS_NAME \
  --name $CONTAINERAPPS_NAME \
  --resource-group $RESOURCE_GROUP \
  --image $ACR_BASE.azurecr.io/$REPOSITORY_NAME:v1 \
  --min-replicas 1 \
  --max-replicas 5 \
  --query properties.configuration.ingress.fqdn

# Change revision mode
az containerapp revision set-mode \
  --name $CONTAINERAPPS_NAME \
  --resource-group $RESOURCE_GROUP \
  --mode multiple

# Split traffic
az containerapp ingress traffic set \
    --name $CONTAINERAPPS_NAME \
    --resource-group $RESOURCE_GROUP \
    --label-weight label90=0 v1-1=0 v2-1=80 label12=20

    https://learn.microsoft.com/en-us/azure/container-apps/traffic-splitting?pivots=azure-cli


V2:

	# Update existing containerapp with v2
	az containerapp update \
	  --container-name $CONTAINERAPPS_NAME \
	  --name $CONTAINERAPPS_NAME \
	  --resource-group $RESOURCE_GROUP \
	  --image $ACR_BASE.azurecr.io/$REPOSITORY_NAME:v2 \
	  --min-replicas 1 \
	  --max-replicas 5 \
	  --revision-suffix v2 \
	  --query properties.configuration.ingress.fqdn


	# Adding Label to the recent revision
	az containerapp revision label add -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP --label v2 --revision latest


	# Split traffic
	az containerapp ingress traffic set \
	    --name $CONTAINERAPPS_NAME \
	    --resource-group $RESOURCE_GROUP \
	    --label-weight v1=80 v2=20

	verify:
	?


V3:

	# Push to ACR:
	docker build -t rj-server:v3 .

	docker tag rj-server:v3 rjsimpleflask.azurecr.io/rj-flask-server:v3

	docker push rjsimpleflask.azurecr.io/rj-flask-server:v3

	# Update existing containerapp with v3
	az containerapp update \
	  --container-name $CONTAINERAPPS_NAME \
	  --name $CONTAINERAPPS_NAME \
	  --resource-group $RESOURCE_GROUP \
	  --image $ACR_BASE.azurecr.io/$REPOSITORY_NAME:v3 \
	  --min-replicas 1 \
	  --max-replicas 5 \
	  --revision-suffix v3 \
	  --query properties.configuration.ingress.fqdn

	  verify:
	  ?


	# Adding Label to the recent revision
	az containerapp revision label add -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP --label v3 --revision latest


	# Split traffic
	az containerapp ingress traffic set \
	    --name $CONTAINERAPPS_NAME \
	    --resource-group $RESOURCE_GROUP \
	    --label-weight v2=80 v3=20



	# deactivate
	az containerapp revision deactivate --revision $CONTAINERAPPS_NAME--if8rxli \
                                    --name $CONTAINERAPPS_NAME \
                                    --resource-group $RESOURCE_GROUP


		https://learn.microsoft.com/en-us/cli/azure/containerapp/revision?view=azure-cli-latest#az-containerapp-revision-deactivate



V4:

	# Push to ACR:
	docker build -t rj-server:v4 .

	docker tag rj-server:v4 rjsimpleflask.azurecr.io/rj-server:v4

	docker push rjsimpleflask.azurecr.io/rj-server:v4

	# Update existing containerapp with v4
	az containerapp update \
	  --container-name $CONTAINERAPPS_NAME \
	  --name $CONTAINERAPPS_NAME \
	  --resource-group $RESOURCE_GROUP \
	  --image $ACR_BASE.azurecr.io/$REPOSITORY_NAME:v4 \
	  --min-replicas 1 \
	  --max-replicas 5 \
	  --revision-suffix v4 \
	  --query properties.configuration.ingress.fqdn

	  verify:
	  ?


	# Adding Label to the recent revision
	az containerapp revision label add -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP --label v4 --revision latest


	# Split traffic
	az containerapp ingress traffic set \
	    --name $CONTAINERAPPS_NAME \
	    --resource-group $RESOURCE_GROUP \
	    --label-weight v3=70 v4=30
Microservice: Client

Client:


RESOURCE_GROUP="rjresroucegroup"
LOCATION="centralindia"
CONTAINERAPPS_ENVIRONMENT="rjresroucegroup-env"
CONTAINERAPPS_NAME="rj-client"
ACR_BASE="rjsimpleflask"
REPOSITORY_NAME="rj-flask-client"
SUBSCRIPTION_ID="965..00f8d0"


# Docker Image
Push to ACR:

	docker build -t rj-client:v1 .

	docker tag rj-client:v1 rjsimpleflask.azurecr.io/rj-flask-client:v1

	docker push rjsimpleflask.azurecr.io/rj-flask-client:v1

az login
az acr login --name $ACR_BASE

# how to create a container app
az containerapp up \
	  --name $CONTAINERAPPS_NAME \
	  --resource-group $RESOURCE_GROUP \
	  --location $LOCATION \
	  --environment $CONTAINERAPPS_ENVIRONMENT \
	  --image $ACR_BASE.azurecr.io/$REPOSITORY_NAME:v1 \
	  --target-port 5001 \
	  --ingress external \
	  --query properties.configuration.ingress.fqdn \
	  --env-vars API_BASE=https://rj-server.wittyfield-91da3b68.centralindia.azurecontainerapps.io/


	# verify
	az containerapp logs show -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP --type system --tail 50

	az containerapp show -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP


# Update replicas
az containerapp update \
	--name $CONTAINERAPPS_NAME \
	--resource-group $RESOURCE_GROUP \
	--min-replicas 1 \
	--max-replicas 4

	# It is creating a new revision


# Check revision
az containerapp revision list \
  --name $CONTAINERAPPS_NAME \
  --resource-group $RESOURCE_GROUP \
  -o table



# rbac
az ad sp create-for-rbac \
  --name $CONTAINERAPPS_NAME \
  --role contributor \
  --scopes /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP \
  --json-auth \
  --output json



# Adding Label to the recent revision
az containerapp revision label add -n $CONTAINERAPPS_NAME -g $RESOURCE_GROUP --label v2 --revision latest

# Adding Label to the previous revision matching by revision (name)
az containerapp revision label add -g $RESOURCE_GROUP --label v1 --revision rj-client--gx7kp53

# Change revision mode
az containerapp revision set-mode \
  --name $CONTAINERAPPS_NAME \
  --resource-group $RESOURCE_GROUP \
  --mode multiple

# Split traffic
az containerapp ingress traffic set \
    --name $CONTAINERAPPS_NAME \
    --resource-group $RESOURCE_GROUP \
    --label-weight v1=80 v2=20


# Split traffic by version name
az containerapp ingress traffic set \
	-n $CONTAINERAPPS_NAME \
	-g $RESOURCE_GROUP \
	--revision-weight latest=20 cner-server--wg241rj=80

Ref:

Auto Deployment with ACA

https://github.com/kactlabs/titanic-prediction-flask

docker login --username=rajacsp

resource group:
ml-poc-riversand


Server:
	container-app-name:
		sample-flask-titanic-ml-server

	https://sample-flask-titanic-ml-server.victoriousmushroom-7878b821.centralindia.azurecontainerapps.io


v1:
	Decision Tree

	docker build -t ml-server .
	docker run -p 9090:5000 --name ml-server-112 ml-server:latest

	http://0.0.0.0:9090/

	Push to DockerHub:

		docker build -t titanic-ml-server:v1 .

		docker tag titanic-ml-server:v1 rajacsp/titanic-ml-server:v1
			https://hub.docker.com/repository/docker/rajacsp/titanic-ml-server/tags?page=1&ordering=last_updated



		docker push rajacsp/titanic-ml-server:v1

v2:
	SVC

	docker build -t titanic-ml-server:v2 .
	docker run -p 9091:5000 --name titanic-ml-server-v2 titanic-ml-server:v2

		if already available, use this:
		docker rm <id>

	Push to DockerHub:

		docker build -t titanic-ml-server:v2 .

		docker tag titanic-ml-server:v2 rajacsp/titanic-ml-server:v2

		docker push rajacsp/titanic-ml-server:v2


	Push to ACR:

		mlpocriversand.azurecr.io

		docker tag titanic-ml-server:v2 mlpocriversand.azurecr.io/titanic-ml-server:v2

		docker push mlpocriversand.azurecr.io/titanic-ml-server:v2

		5000



v3:
	LR


	docker build -t titanic-ml-server:v3 .
	docker run -p 9091:5000 --name titanic-ml-server-v3 titanic-ml-server:v3

		if already available, use this:
		docker rm <id>

	Push to DockerHub:

		docker build -t titanic-ml-server:v3 .

		docker tag titanic-ml-server:v3 rajacsp/titanic-ml-server:v3

		docker push rajacsp/titanic-ml-server:v3


	Push to ACR:

		mlpocriversand.azurecr.io

		docker tag titanic-ml-server:v3 mlpocriversand.azurecr.io/titanic-ml-server:v3

		docker push mlpocriversand.azurecr.io/titanic-ml-server:v2

		5000


Failed to deploy new revision: WorkloadProfiles configuration is not supported in  api version. Use 2022-11-01-preview or above.


az acr login --name mlpocriversand

# Create
az containerapp up \
  --name sample-flask-titanic-ml-server \
  --resource-group ml-poc-riversand \
  --location centralindia \
  --environment 'ml-poc-riversand' \
  --image mlpocriversand.azurecr.io/titanic-ml-server:v2 \
  --target-port 5000 \
  --ingress external \
  --query properties.configuration.ingress.fqdn

	# Verify
		az containerapp show -n sample-flask-titanic-ml-server -g ml-poc-riversand

		az containerapp logs show -n sample-flask-titanic-ml-server -g ml-poc-riversand

		http://sample-flask-titanic-ml-server.victoriousmushroom-7878b821.centralindia.azurecontainerapps.io


# Login ACR
az acr login --name mlpocriversand



# Check revision
az containerapp revision list \
  --name sample-flask-titanic-ml-server-1 \
  --resource-group ml-poc-riversand \
  -o table


# Create a revision
az containerapp revision copy \
	--container-name sample-flask-titanic-ml-server-1 \
	-n sample-flask-titanic-ml-server-1 \
	--resource-group ml-poc-riversand \
	--image mlpocriversand.azurecr.io/titanic-ml-server:v2 \
	--max-replicas 6 \
	--min-replicas 1 \
	--revision-suffix v2 \
	--cpu 0.75 --memory 1.5Gi


	https://learn.microsoft.com/en-us/cli/azure/containerapp/revision?view=azure-cli-latest#az-containerapp-revision-copy


# Update label on previous revision
az containerapp revision label add \
	-n sample-flask-titanic-ml-server-1 \
	-g ml-poc-riversand \
	--label v2 \
	--revision latest


# Udpate Traffic on multiple labels
az containerapp ingress traffic set \
	-n sample-flask-titanic-ml-server-1 \
	-g ml-poc-riversand \
	--label-weight v1=80 v2=20


	https://learn.microsoft.com/en-us/cli/azure/containerapp/ingress/traffic?view=azure-cli-latest#az-containerapp-ingress-traffic-set


Github Actions:

template:
az ad sp create-for-rbac \
	--name my-app-credentials \
	--role contributor \
	--scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/my-container-app-rg \
	--json-auth \
	--output json

# get subscription id
az account show --query id

	5de4727f-d9d6-4052-81e4-bb3781f6c961

	https://yourazurecoach.com/2020/07/14/get-subscription-id-with-azure-cli/

az ad sp create-for-rbac \
	--name ml-server-creds \
	--role contributor \
	--scopes /subscriptions/5de4727f-d9d6-4052-81e4-bb3781f6c961/resourceGroups/ml-poc-riversand \
	--json-auth \
	--output json

https://learn.microsoft.com/en-us/azure/container-apps/github-actions