This guide documents the complete deployment of your existing Syed Portfolio API (.NET 8) from your Windows machine to Azure App Service using Docker and Azure Container Registry (ACR).
We will use the same architecture and configuration that we successfully implemented.
Final deployment architecture
Windows Development Machine
Visual Studio · Git · Docker Desktop
Docker build and push
Azure Container Registry
jntechportfolioacr.azurecr.io
Stores Docker images
Managed Identity · AcrPull
Azure App Service
jntech-portfolio-api · Linux · F1
Runs the Docker container on port 8080
Azure Key Vault
Secrets and configuration
Azure SQL Database
Application data
1. Deployment information
These are the actual names used in our deployment.
|
Resource |
Name / Configuration |
|---|---|
|
Solution |
Syed.PortfolioPlatform |
|
API project |
Syed.PortfolioPlatform.API |
|
Framework |
.NET 8 |
|
Database |
Azure SQL Database |
|
Resource Group |
|
|
ACR |
|
|
ACR Login Server |
|
|
Image Repository |
|
|
App Service |
|
|
Operating System |
Linux |
|
App Service Plan |
F1 Free |
|
Azure Region |
Central India |
|
Container Port |
8080 |
|
Git Branch |
Dev |
Important: We will retain .NET 8, as requested. No framework or EF Core version changes are included.
Part 1 – Prepare the Docker configuration
Step 1. Open your solution directory
Your project location:
D:\Syed\Project 2026\Portfolio Project\Syed Portfolio Project\Azure Portfolio
Open PowerShell:
cd "D:\Syed\Project 2026\Portfolio Project\Syed Portfolio Project\Azure Portfolio"
Your solution structure:
Azure Portfolio
│
├── Syed.PortfolioPlatform.sln
│
├── Syed.PortfolioPlatform.API
│ ├── Controllers
│ ├── Program.cs
│ └── Syed.PortfolioPlatform.API.csproj
│
├── Syed.PortfolioPlatform.Application
│
├── Syed.PortfolioPlatform.Domain
│
├── Syed.PortfolioPlatform.Infrastructure
│
├── Syed.PortfolioPlatform.Functions.Notifications
│
└── Syed.PortfolioPlatform.Web
We will create the Dockerfile in the solution root, not inside the API project.
Step 2. Create Dockerfile
Create a file named:
Dockerfile
Location:
Azure Portfolio\Dockerfile
Add the following content:
# Stage 1: Build the application
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# Copy source code
COPY . .
# Restore dependencies
RUN dotnet restore "Syed.PortfolioPlatform.API/Syed.PortfolioPlatform.API.csproj"
# Publish the API
RUN dotnet publish "Syed.PortfolioPlatform.API/Syed.PortfolioPlatform.API.csproj" \
-c Release \
-o /app/publish \
--no-restore
# Stage 2: Runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
WORKDIR /app
# Application listening port
ENV ASPNETCORE_HTTP_PORTS=8080
EXPOSE 8080
# Copy published application
COPY --from=build /app/publish .
# Start API
ENTRYPOINT ["dotnet", "Syed.PortfolioPlatform.API.dll"]
Understand the Dockerfile
|
Instruction |
Purpose |
|---|---|
|
SDK image |
Used to compile the .NET application |
|
WORKDIR |
Sets the container working directory |
|
COPY |
Copies source code into build context |
|
dotnet restore |
Downloads NuGet dependencies |
|
dotnet publish |
Compiles and publishes the application |
|
ASP.NET runtime |
Runs the published application |
|
EXPOSE 8080 |
Documents the container HTTP port |
|
ENTRYPOINT |
Starts the Portfolio API |
We are using a multi-stage Docker build.
Source Code
|
▼
.NET 8 SDK Image
|
▼
Restore NuGet Packages
|
▼
Publish API
|
▼
.NET 8 ASP.NET Runtime Image
|
▼
Final Docker Image
The final runtime image doesn't contain the complete .NET SDK.
Step 3. Create .dockerignore
Create another file:
.dockerignore
Add:
**/bin/
**/obj/
**/.vs/
.vs/
.vscode/
.git/
.github/
**/TestResults/
**/*.user
**/*.suo
.env
.env.*
**/secrets*.json
Syed.PortfolioPlatform.Web/
Syed.PortfolioPlatform.Functions.Notifications/
Why do we need it?
Docker uses the build context to determine which files to send to the Docker engine.
We don't need to include:
-
Compiled files (
bin,obj). -
Visual Studio temporary files.
-
Git repository information.
-
Environment files containing secrets.
-
Unrelated Web and Functions projects.
This reduces the build context and prevents unnecessary files from being copied into the build environment.
Step 4. Verify the Docker configuration
Execute:
Get-Content .\Dockerfile
Get-Content .\.dockerignore
Our solution root now contains:
Azure Portfolio
│
├── Dockerfile
├── .dockerignore
├── Syed.PortfolioPlatform.sln
│
├── Syed.PortfolioPlatform.API
├── Syed.PortfolioPlatform.Application
├── Syed.PortfolioPlatform.Domain
└── Syed.PortfolioPlatform.Infrastructure
Part 2 – Build and test the Docker image locally
Step 5. Build Docker image
Make sure Docker Desktop is running.
Execute:
docker build -t syed-portfolio-api:v1 .
Explanation:
|
Command |
Purpose |
|---|---|
|
docker build |
Builds a Docker image |
|
-t |
Assigns an image name and tag |
|
syed-portfolio-api |
Image name |
|
v1 |
Image version |
|
. |
Current directory as Docker build context |
Verify:
docker images syed-portfolio-api
Expected:
REPOSITORY TAG
syed-portfolio-api v1
Step 6. Run the Docker container locally
Initially, we tried running the container using default settings and encountered a Key Vault authentication error.
This happened because your Program.cs loads Azure Key Vault in Production mode.
For local Docker testing, we use Development mode.
Your existing code:
if (builder.Environment.IsProduction())
{
var vaultUri = builder.Configuration["KeyVault:VaultUri"];
if (!string.IsNullOrEmpty(vaultUri))
{
builder.Configuration.AddAzureKeyVault(
new Uri(vaultUri),
new DefaultAzureCredential());
}
}
When running locally:
ASPNETCORE_ENVIRONMENT=Development
The application skips Azure Key Vault initialization.
6.1 Prepare local SQL Server
Our local API uses SQL Server running directly on Windows.
We configured:
-
SQL Server default instance:
MSSQLSERVER. -
TCP/IP: Enabled.
-
Static port:
1433. -
Authentication: SQL Server and Windows Authentication.
-
SQL login:
portfolio_docker_user. -
Database:
ServerDB_Bak_121026.
The important distinction:
Windows:
Server=.
means your local Windows SQL Server.
Inside Docker:
Server=.
means the container itself.
Therefore, we use:
host.docker.internal,1433
This allows a Docker Desktop container to connect to services on your Windows host.
6.2 Run container with database connection
Use this PowerShell script.
# Get password securely
$securePassword = Read-Host "SQL Password" -AsSecureString
$sqlPassword = [Net.NetworkCredential]::new(
"",
$securePassword
).Password
# Create connection string
$builder = [System.Data.Common.DbConnectionStringBuilder]::new()
$builder["Server"] = "host.docker.internal,1433"
$builder["Database"] = "ServerDB_Bak_121026"
$builder["User ID"] = "portfolio_docker_user"
$builder["Password"] = $sqlPassword
$builder["Encrypt"] = "True"
$builder["TrustServerCertificate"] = "True"
# Run Docker container
docker run -d `
--name syed-portfolio-api-local `
-e ASPNETCORE_ENVIRONMENT=Development `
-e "ConnectionStrings__DefaultConnection=$($builder.ConnectionString)" `
-p 8080:8080 `
syed-portfolio-api:v1
# Clear local variables
Remove-Variable sqlPassword, securePassword, builder
Security note: This is for local practice. Docker environment variables can be viewed by users with Docker access through container inspection. Don't use this method to store production secrets.
6.3 Understand port mapping
-p 8080:8080
The first port is the Windows host port.
The second port is the container port.
Windows Machine
|
| http://localhost:8080
|
▼
Docker Container
|
| Port 8080
|
▼
ASP.NET Core API
6.4 Verify the running container
Execute:
docker ps
Then:
docker logs syed-portfolio-api-local
Expected application log:
Starting DB Migration...
DB Migration completed
6.5 Test locally
Open:
http://localhost:8080/swagger
We successfully tested Swagger and our API endpoints.
You can also test:
http://localhost:8080/api/articles/categories
Part 3 – Prepare a traceable Docker image
Step 7. Commit Docker configuration to Git
We used Git to ensure that the Docker image can be traced back to a specific source-code revision.
Check Git:
git status --short
Stage the Docker files:
git add Dockerfile .dockerignore
Review:
git diff --cached --check
git diff --cached
Commit:
git commit -m "Add Docker build configuration"
Verify:
git log -1 --oneline
Our final commit SHA:
4c39725130e3
Check the working directory:
git status --short
Expected: No output, indicating a clean working tree.
Step 8. Build a Git-based Docker image
Instead of using a generic tag like latest, we use a tag derived from the Git commit SHA.
This provides traceability.
Execute:
$gitSha = (git rev-parse --short=12 HEAD).Trim()
$imageTag = "sha-$gitSha"
$localImage = "syed-portfolio-api:$imageTag"
Write-Host $localImage
Expected:
syed-portfolio-api:sha-4c39725130e3
Now build:
docker build --pull -t $localImage .
Verify:
docker images syed-portfolio-api
Our image version is now:
syed-portfolio-api:sha-4c39725130e3
A future source-code commit will produce a different tag.
Part 4 – Create Azure Container Registry
Step 9. Create ACR in Azure Portal
Open <Link url="https://portal.azure.com/" title="Azure Portal"/>.
Follow:
-
Search for Container registries.
-
Select Create.
-
Configure the Basics tab.
|
Setting |
Value |
|---|---|
|
Subscription |
Your Azure subscription |
|
Resource Group |
|
|
Registry Name |
|
|
Region |
Central India |
|
SKU |
Your selected registry tier |
For this exercise, a Basic registry is generally sufficient for a small image repository. Choose a higher tier when your throughput, storage or advanced registry requirements justify it.
9.1 Review advanced settings
Our ACR uses:
RBAC Registry Permissions
Retain this permission mode.
This is important because we will use the standard AcrPull role for App Service.
-
Select Review + create.
-
Select Create.
-
Wait for successful deployment.
-
Select Go to resource.
9.2 Verify ACR
On the Overview page:
|
Property |
Value |
|---|---|
|
Registry Name |
|
|
Login Server |
|
|
Provisioning State |
Succeeded |
Part 5 – Push Docker image to ACR
This part requires Docker and Azure CLI commands on your development machine.
The Azure resources themselves were created and configured through the Azure Portal.
The Portal doesn't directly take a local Docker image from your D: drive and push it to ACR. Docker must perform that upload.
Step 10. Authenticate Docker with Azure
Check Azure CLI:
az --version
Check your subscription:
az account show --output table
Log in to ACR:
az acr login --name jntechportfolioacr
Expected:
Login Succeeded
Your user identity must have permission to push images to this registry, typically through the AcrPush role under the current RBAC permission mode.
Step 11. Tag the Docker image
Get the ACR login server:
$loginServer = "jntechportfolioacr.azurecr.io"
Generate the image reference:
$gitSha = (git rev-parse --short=12 HEAD).Trim()
$imageTag = "sha-$gitSha"
$localImage = "syed-portfolio-api:$imageTag"
$acrImage = "$loginServer/syed-portfolio-api:$imageTag"
Tag the image:
docker tag $localImage $acrImage
Verify:
docker image inspect $acrImage --format '{{.Id}}'
Compare it with the local image:
docker image inspect $localImage --format '{{.Id}}'
Both should display the same image ID.
Our ACR image reference:
jntechportfolioacr.azurecr.io/syed-portfolio-api:sha-4c39725130e3
Step 12. Push image to ACR
Execute:
docker push $acrImage
Docker will upload the image layers and manifest.
Expected result:
sha-4c39725130e3: digest: sha256:xxxxx size: xxxx
We previously encountered:
authentication required
The solution was to authenticate again:
az acr login --name jntechportfolioacr
Then retry:
docker push $acrImage
Step 13. Verify image in Azure Portal
Open:
Azure Portal → Container registries → jntechportfolioacr.
Navigate to Repositories.
Select:
syed-portfolio-api
You should find:
sha-4c39725130e3
You can also inspect the image manifest digest.
<badge color="success">Docker image successfully stored in ACR</badge>
Part 6 – Create Azure App Service
Step 14. Create App Service
In Azure Portal:
-
Search for App Services.
-
Select Create → Web App.
14.1 Basics tab
Use the following settings:
|
Setting |
Value |
|---|---|
|
Subscription |
Your subscription |
|
Resource Group |
|
|
Name |
|
|
Publish |
Container |
|
Operating System |
Linux |
|
Region |
Central India |
|
App Service Plan |
|
|
Pricing Plan |
F1 Free |
Our F1 plan is being used for learning and testing, not production.
14.2 Container tab
Configure:
|
Setting |
Value |
|---|---|
|
Image Source |
Azure Container Registry |
|
Registry |
|
|
Image |
|
|
Tag |
|
|
Port |
|
The container must expose the same HTTP port that the ASP.NET Core application listens on.
14.3 Create Web App
-
Select Review + create.
-
Verify all settings.
-
Select Create.
-
Wait for deployment.
-
Select Go to resource.
Part 7 – Configure Managed Identity
Managed Identity allows Azure services to authenticate without storing passwords or credentials in the application.
Step 15. Enable System-Assigned Managed Identity
In Azure Portal:
-
Open App Service:
jntech-portfolio-api. -
Navigate to Settings → Identity.
-
Select System assigned.
-
Change Status to On.
-
Select Save.
-
Confirm the operation.
Azure generates an Object/Principal ID.
This identity represents your App Service.
Step 16. Grant ACR image-pull permission
We configured our ACR using RBAC Registry Permissions.
Therefore, assign the standard AcrPull role.
In Azure Portal:
-
Open
jntechportfolioacr. -
Select Access control (IAM).
-
Select Add → Add role assignment.
-
Search for
AcrPull. -
Select
AcrPull. -
Click Next.
Members tab
Configure:
|
Setting |
Value |
|---|---|
|
Assign access to |
Managed identity |
|
Subscription |
Your subscription |
|
Managed identity |
App Service |
|
Select |
|
-
Click Select.
-
Click Review + assign.
-
Complete the assignment.
Architecture:
App Service
|
▼
System-Assigned Managed Identity
|
▼
Microsoft Entra ID
|
▼
AcrPull Permission
|
▼
Azure Container Registry
Important correction for our deployment: We initially explored Container Registry Repository Reader because of the ABAC permission model. However, your actual registry uses RBAC Registry Permissions. The applicable role is AcrPull. Don't use the earlier conditional Repository Reader assignment for this deployment.
Step 17. Configure App Service container authentication
Open:
App Service → jntech-portfolio-api → Deployment → Deployment Center → Containers.
Select the main container to edit.
Configure:
|
Setting |
Value |
|---|---|
|
Registry source |
Azure Container Registry |
|
Authentication |
Managed Identity |
|
Identity |
System Assigned |
|
Registry |
|
|
Image |
|
|
Tag |
|
|
Port |
|
Select Apply or Save.
Now Azure App Service can authenticate to ACR using its Managed Identity.
Part 8 – Configure Azure Key Vault
Your API uses Azure Key Vault to retrieve application secrets during Production startup.
Your existing implementation:
if (builder.Environment.IsProduction())
{
var vaultUri = builder.Configuration["KeyVault:VaultUri"];
if (!string.IsNullOrEmpty(vaultUri))
{
builder.Configuration.AddAzureKeyVault(
new Uri(vaultUri),
new DefaultAzureCredential());
}
}
We must configure Key Vault access for the same App Service Managed Identity.
Step 18. Verify Key Vault permission model
In Azure Portal:
-
Search for Key vaults.
-
Open your Portfolio Key Vault.
-
Navigate to Settings → Access configuration.
-
Verify the permission model.
Our existing configuration:
Vault access policy
Do not change it.
Step 19. Grant Key Vault permissions
Open:
Key Vault → Access policies → Create.
Permissions tab
Select:
|
Category |
Permissions |
|---|---|
|
Key permissions |
None |
|
Secret permissions |
Get, List |
|
Certificate permissions |
None |
Why Get and List?
Your application uses the Azure Key Vault configuration provider, which must enumerate and retrieve secrets.
Principal tab
-
Click Select principal.
-
Search for
jntech-portfolio-api. -
Select the System-Assigned Managed Identity.
-
Click Select.
-
Continue and create the access policy.
Expected:
Principal:
jntech-portfolio-api
Secret permissions:
Get
List
Step 20. Verify Key Vault secrets
Navigate to:
Key Vault → Objects → Secrets.
Verify these secret names:
|
Key Vault secret |
ASP.NET Core configuration |
|---|---|
|
|
|
|
|
|
The double hyphen -- is used as the hierarchy separator by the Azure Key Vault configuration provider.
Important: Your production connection string must point to Azure SQL Database, not your Windows SQL Server.
Don't use your local connection string:
Server=.;
Trusted_Connection=True;
The actual secret values must remain inside Key Vault. Never place database credentials in your Dockerfile or Git repository.
Part 9 – Configure App Service environment variables
Now we will configure three important environment variables.
Step 21. Open Environment variables
In Azure Portal:
-
Open
jntech-portfolio-api. -
Navigate to Settings → Environment variables.
-
Select App settings.
-
Click + Add.
Add the following three settings.
|
Name |
Value |
Purpose |
|---|---|---|
|
|
|
Routes HTTP requests to container port |
|
|
|
Runs the application in Production |
|
|
Actual Key Vault URI |
Configures Key Vault |
Example:
WEBSITES_PORT = 8080
ASPNETCORE_ENVIRONMENT = Production
KeyVault__VaultUri =
https://your-keyvault-name.vault.azure.net/
The exact Key Vault URI should be copied from your Key Vault Overview page.
Why WEBSITES_PORT?
Your Dockerfile contains:
ENV ASPNETCORE_HTTP_PORTS=8080
EXPOSE 8080
By default, Azure App Service assumes custom containers listen on port 80. Setting WEBSITES_PORT=8080 tells App Service which internal HTTP port to route to. <Cite refs={["turn289939search0","turn224251search3"]}/>
Why double underscore?
ASP.NET Core converts:
KeyVault__VaultUri
into:
KeyVault:VaultUri
This matches your existing Program.cs configuration.
After adding all three settings:
-
Click Apply.
-
Click Save.
-
Confirm the App Service restart.
Part 10 – Verify deployment and application startup
Step 22. Verify container deployment
Open:
App Service → Deployment Center → Containers.
Verify these details:
|
Property |
Expected |
|---|---|
|
Container |
main |
|
Type |
Main |
|
Source |
Azure Container Registry |
|
Image |
syed-portfolio-api |
|
Tag |
sha-4c39725130e3 |
|
Port |
8080 |
Step 23. Enable application logging
Open:
App Service → Monitoring → App Service logs.
Configure:
|
Setting |
Value |
|---|---|
|
Application logging |
File System |
|
Quota |
35 MB |
|
Retention |
1 day |
Save the configuration.
Then navigate to:
Monitoring → Log stream
This displays live log entries when the application writes them to the container console.
Step 24. Examine Docker container logs through Kudu
We used this approach to troubleshoot our actual deployment.
In Azure Portal:
-
Open App Service.
-
Navigate to Development Tools → Advanced Tools.
-
Select Go.
-
Open Kudu Dashboard.
-
Select Browse Log Files.
-
Open
/home/LogFiles/.
Find:
*_default_docker.log
Don't confuse it with:
*_default_scm_docker.log
The second file contains Kudu/SCM management container logs, not your Portfolio API application logs.
Our actual API container log showed:
Starting DB Migration...
DB Migration completed
This confirmed that database migration completed successfully.
Microsoft documents the App Service container log locations and Kudu access procedure in its custom container diagnostics documentation. <Cite refs={["turn224251search3","turn224251search5"]}/>
Step 25. Verify API through the browser
Open:
App Service → Overview.
Copy the Default Domain.
Example:
https://jntech-portfolio-api.azurewebsites.net
Test your API:
https://jntech-portfolio-api.azurewebsites.net/api/articles/categories
<badge color="success">Successful deployment</badge>
In our deployment, this endpoint returned category data successfully.
You can also test:
-
Article listing.
-
Category listing.
-
Tag listing.
-
Other public API endpoints.
Remember, Swagger may be disabled in Production. Successful API responses are a better deployment check than Swagger availability alone.
Part 11 – Deployment maintenance and best practices
The initial deployment is completed. The following practices should be followed for future releases.
Step 26. Deploy a new version
Whenever you change your Portfolio API source code:
1. Commit source code
git add .
git commit -m "Update portfolio API"
2. Generate a new image tag
$gitSha = (git rev-parse --short=12 HEAD).Trim()
$imageTag = "sha-$gitSha"
$localImage = "syed-portfolio-api:$imageTag"
3. Build Docker image
docker build --pull -t $localImage .
4. Tag for ACR
$loginServer = "jntechportfolioacr.azurecr.io"
$acrImage = "$loginServer/syed-portfolio-api:$imageTag"
docker tag $localImage $acrImage
5. Authenticate and push
az acr login --name jntechportfolioacr
docker push $acrImage
6. Update App Service
In Azure Portal:
App Service → Deployment Center → Containers.
Edit the image tag from the previous version to the new version and save.
Azure App Service will pull the new image and restart the application.
7. Verify
Test your API URL and inspect container logs.
Step 27. Rollback
Suppose your new deployment has a problem.
Your ACR might contain:
syed-portfolio-api
|
├── sha-previous-version
|
└── sha-new-version
To roll back:
-
Open Azure App Service.
-
Navigate to Deployment Center → Containers.
-
Edit the container.
-
Change the image tag to the previously successful version.
-
Save and restart.
-
Test the API.
This is why Git-based image versioning is useful.
Step 28. Remove unnecessary permissions
For our current configuration:
-
Keep
AcrPullassigned tojntech-portfolio-api. -
Keep the Key Vault Get and List access policy.
-
Remove the earlier conditional
Container Registry Repository Readerassignment if it still exists and is no longer needed.
Do not enable ACR administrator credentials just to simplify authentication.
Part 12 – What about Docker Compose?
Docker Compose is not required in this deployment.
Your current architecture contains one API container.
Portfolio API
|
▼
Dockerfile
|
▼
Docker Image
|
▼
ACR
|
▼
Azure App Service
Docker Compose is useful when you want to start multiple related containers together during local development.
For example:
docker-compose.yml
|
├── Portfolio API
|
├── SQL Server
|
└── Redis
You can start the entire local environment using:
docker compose up
For this single-container App Service deployment, the Dockerfile is sufficient.
Step 29. Docker-to-Azure Deployment Checklist
Tick each item as you complete it. Progress is interactive within this checklist.
1. Docker preparation
2. Local Docker build and testing
3. Git and image versioning
4. Azure Container Registry
5. Azure App Service creation
6. Managed Identity and ACR integration
7. Azure Key Vault configuration
8. Azure SQL Database connectivity
9. App Service application settings
10. Deployment and application verification
11. Deployment maintenance
Important corrections to the previous checklist
There are five points I particularly want to highlight.
|
Area |
Correct approach |
|---|---|
|
ACR permission model |
RBAC Registry Permissions |
|
Developer pushing image |
|
|
App Service pulling image |
|
|
Key Vault authentication |
Vault access policy with Get and List |
|
Production database |
Azure SQL connection string stored in Key Vault |
Additional best practices:
-
Build an image once, test that exact image, and push the same image to ACR. Avoid rebuilding between testing and deployment.
-
Keep production credentials out of Dockerfiles, source control and image layers.
-
Your API currently performs EF Core migrations during startup. For a production system, consider a controlled migration step in the release pipeline instead of relying on every application instance to execute migrations.
-
F1 is appropriate for your Docker learning exercise. Use a suitable paid App Service tier for a production public API.
This is the corrected checklist I recommend keeping as your master deployment reference.
Part 13 – Important production considerations
Before using this architecture for a real public application, consider the following.
|
Area |
Current setup |
Future improvement |
|---|---|---|
|
App Service Plan |
F1 Free |
Paid production plan |
|
Framework |
.NET 8 |
Upgrade to supported .NET LTS |
|
Image version |
Git SHA tag |
Enforce registry tag immutability where supported |
|
Database migration |
API startup migration |
Controlled migration job or deployment stage |
|
Secrets |
Key Vault |
Continue using Managed Identity |
|
Logging |
Container logs |
Centralized Azure Monitor / Application Insights |
|
Deployment |
Manual Docker push |
Automated CI/CD |
|
Rollback |
Change image tag |
Automated release rollback procedure |
Important: The F1 plan is also suitable for this learning exercise, not a production SLA-backed public service.
Official Microsoft documentation
For future reference: