【问题标题】:Using Terraform, how to create an Azure App Service for Windows and Docker使用 Terraform,如何为 Windows 和 Docker 创建 Azure 应用服务
【发布时间】:2025-11-30 21:15:01
【问题描述】:

我的团队正在尝试使用 Terraform 创建一个使用 Windows Docker 容器的 Azure 应用服务。

我测试了the docker-basic example, from the Terraform GitHub project,成功创建了Linux Docker App Service。

接下来,我使用 azurerm_app_serviceazurerm_app_service_plan 的 Terraform 文档,将 main.tf 文件更改为将使用 Windows IIS Docker image 创建 Windows Docker 应用服务的文件。这是更新后的main.tf 文件:

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "main" {
  name     = "${var.prefix}-resources"
  location = "${var.location}"
}

resource "azurerm_app_service_plan" "main" {
  name                = "${var.prefix}-asp"
  location            = "${azurerm_resource_group.main.location}"
  resource_group_name = "${azurerm_resource_group.main.name}"
  kind                = "Windows"
  reserved            = false

  sku {
    tier = "Standard"
    size = "S1"
  }
}

resource "azurerm_app_service" "main" {
  name                = "${var.prefix}-appservice"
  location            = "${azurerm_resource_group.main.location}"
  resource_group_name = "${azurerm_resource_group.main.name}"
  app_service_plan_id = "${azurerm_app_service_plan.main.id}"

  site_config {
    app_command_line = ""
    windows_fx_version = "DOCKER|windows/servercore/iis:windowsservercore-ltsc2019"
  }

  app_settings = {
    "WEBSITES_ENABLE_APP_SERVICE_STORAGE" = "false"
    "DOCKER_REGISTRY_SERVER_URL"          = "https://mcr.microsoft.com"
  }
}

有 4 个变化。在azurerm_app_service_plan 中,kind 字段现在设置为“Windows”,reserved 字段现在设置为 false。在azurerm_app_service中,Docker镜像在windows_fx_version字段中指定(而不是linux_fx_version),DOCKER_REGISTRY_SERVER_URL指向微软公共docker注册表mcr.microsoft.com(而不是docker.io

Terraform 应用成功,但是创建的 App Service 不是 Docker App Service。相反,它是在 .NET 堆栈配置中创建的。我们将创建的内容与我们在 Azure 门户中创建的 Windows Docker App Service 进行了比较,结果显然不对。

如果需要更多更改,或者我的任何更改有误,我和我的团队无法从官方文档中检测到它们可能是什么。在文档中我们遗漏了什么吗?文档中是否缺少步骤?这是一个真正的 Terraform 错误吗?

【问题讨论】:

    标签: docker terraform terraform-provider-azure azure-appservice azurerm-app-service


    【解决方案1】:

    我在实验室尝试了你提供的代码。

    在 Portal 和 Terraform 中创建的主要区别在于,在 Portal 中,即使对于 windows docker 容器,它也需要 bydeafult 为 “Isxenon:true”kind as “app,container,windows”。但是在使用 terraform 创建 Windows docker 容器时,它需要 “isxenon :false”kind as “app” 这就是为什么它默认提供堆栈设置作为基于代码的应用程序。

    其次,标准Sku不支持Xenon,应该是premiumv3 Sku

    因此,在部署 windows docker 容器时,请对代码进行以下更改:

    在 App 服务计划中:Kind = “xenon”, Is_xenon = true, Sku tier = Premiumv3 大小 = p1v3

    那么main.tf文件会是这样的

    provider "azurerm" {
      features {}
    }
    
    data "azurerm_resource_group" "main" {
      name     = "example-resources"
    }
    
    resource "azurerm_app_service_plan" "main" {
      name                = "testansuman-asp"
      location            = data.azurerm_resource_group.main.location
      resource_group_name = data.azurerm_resource_group.main.name
      kind                = "xenon"
      reserved            = false       
      is_xenon = true
      sku {
        tier = "PremiumV3"
        size = "P1v3"
      }
    }
    
    resource "azurerm_app_service" "main" {
      name                = "dockerwindows-appservice"
      location            = data.azurerm_resource_group.main.location
      resource_group_name = data.azurerm_resource_group.main.name
      app_service_plan_id = azurerm_app_service_plan.main.id
    
      site_config {
        windows_fx_version = "DOCKER|mcr.microsoft.com/azure-app-service/windows/parkingpage:latest"
        use_32_bit_worker_process = true
      }
    
      app_settings = {
        "WEBSITES_ENABLE_APP_SERVICE_STORAGE" = "false"
        "DOCKER_REGISTRY_SERVER_URL"          = "https://mcr.microsoft.com"
      }
    }
    

    我也对其进行了测试,现在我在配置页面中看不到任何堆栈设置。

    注意:当您创建基于代码的应用程序时,您可以使用 kind 作为“APP/Windows”,但创建 docker 容器应用程序您必须选择种类“xenon”和您的 windows docker您要使用的图像。

    【讨论】:

      最近更新 更多