Search code examples
jsonazureazure-rm-template

Deploying Web App for containers using ARM templates


I have been trying to automate deployment of my resources to resource group on Azure. Right now I am using ARM templates and so far I was able to create App Insights and App Service Plan using a template. This is how it looks like:

{
   "apiVersion": "2015-05-01",
   "name": "[variables('servicePlan')]",
   "kind": "linux",
   "type": "Microsoft.Web/serverfarms",
   "location": "[resourceGroup().location]",
   "tags": {
           "displayName": "BTC Push Notification Settings HostingPlan"
    },
    "sku": {
           "name": "[variables('skuNamePlan')]",
           "capacity": "[variables('skuSizePlan')]"
    },
    "properties": {
            "name": "[variables('servicePlan')]"
    }
},
{
    "apiVersion": "2015-05-01",
    "name": "[variables('appInsights')]",
    "type": "Microsoft.Insights/components",
    "location": "southcentralus",
    "tags": {
            "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('appInsights'))]": "Resource",
            "displayName": "BTC Push Notification Settings App Insights"
     },
     "properties": {
            "applicationId": "[variables('appInsights')]"
        }
 }

I am having hard time creating Web App for Containers and pointing it to my docker image using ARM template. I have done it manually and it worked, likewise I did it through azure-cli like this az webapp create --resource-group ExampleGroupAlpina --plan myAppServicePlan --name DockerContainer --deployment-container-image-name this-is-my-image/sample-docker and this worked as well. I would appreciate if anyone could suggest creating this Web App for Containers using ARM Template.


Solution

  • The following ARM template worked for me.

    • It allows to specify the authentication details of a private Azure Container Registry.
    • Also make sure the docker image name follows this pattern: _MY_REGISTRY_USERNAME_-on.azurecr.io/_MY_NAMESPACE_/_MY_DOCKER_IMAGE_NAME_:latest

    I run the az command like this:

    az group deployment create \
      --name "deployAzureApp" \
      --resource-group <MY_RESOURCE_GROUP_NAME> \
      --template-file <MY_ARM_JSON_TEMPLATE>.json  --verbose --debug
    

    Here's the Azure Resource Manager (ARM) JSON template:

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "appName": {
          "type": "String",
          "defaultValue": "_MY_APP_NAME_"
        },
        "dockerImageName": {
          "type": "String",
          "defaultValue": "_MY_REGISTRY_USERNAME_-on.azurecr.io/_MY_NAMESPACE_/_MY_DOCKER_IMAGE_NAME_:latest"
        },
        "dockerRegistryUrl": {
          "type": "String",
          "defaultValue": "https://_MY_REGISTRY_USERNAME_-on.azurecr.io"
        },
        "dockerRegistryUsername": {
          "type": "String",
          "defaultValue": "_MY_REGISTRY_USERNAME_"
        },
        "dockerRegistryPassword": {
          "type": "String",
          "defaultValue": "_MY_REGISTRY_PSW_"
        },
        "servicePlanName": {
          "type": "String",
          "defaultValue": "_MY_SERVICE_PLAN_NAME_"
        },
        "appLocation": {
          "type": "String",
          "defaultValue": "_MY_REGION_"
        }
      },
      "resources": [
        {
          "type": "Microsoft.Web/sites",
          "apiVersion": "2016-08-01",
          "name": "[parameters('appName')]",
          "kind": "app,linux,container",
          "location": "[parameters('appLocation')]",
          "properties": {
            "name": "[parameters('appName')]",
            "siteConfig": {
              "linuxFxVersion": "[concat('DOCKER|', parameters('dockerImageName'))]",
              "alwaysOn": true,
              "appSettings": [
                {
                  "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
                  "value": "false"
                },
                {
                  "name": "DOCKER_REGISTRY_SERVER_URL",
                  "value": "[parameters('dockerRegistryUrl')]"
                },
                {
                  "name": "DOCKER_REGISTRY_SERVER_USERNAME",
                  "value": "[parameters('dockerRegistryUsername')]"
                },
                {
                  "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
                  "value": "[parameters('dockerRegistryPassword')]"
                }
              ]
            },
            "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('servicePlanName'))]"
          }
        }
      ]
    }