Azure Geliştirici CLI'sını kullanarak Azure Container Apps'e dağıtma

Azure Geliştirici CLI'sı (azd), hem Azure Container Apps hem de Azure Container App İşleri dağıtmayı destekler. Azure Container Apps azd için iki dağıtım stratejisi sunar:

  • Görüntü tabanlı strateji. Kapsayıcı uygulaması yapılandırma güncelleştirmelerini görüntü dağıtımlarından ayırır.
  • Düzeltme tabanlı strateji. Her ikisini de tek bir dağıtımda birleştirir ve gelişmiş dağıtım desenlerini destekler.

Aşağıdaki bölümlerde her iki stratejinin yanı sıra Container App İşleri'nin nasıl dağıtılacağı açıklanmaktadır.

Container Apps express'e dağıt (önizleme)

azd Azure Container Apps express (önizleme) için görüntü tabanlı dağıtımları destekler. containerapp içindeki mevcut azure.yaml ana bilgisayarı kullanın; express için ayrı bir ana bilgisayar türüne ihtiyacınız yoktur:

Önemli

Container Apps express desteği için azd sürüm 1.35.0-beta.1 veya üzeri gerekir.

services:
  web:
    host: containerapp
    image: mcr.microsoft.com/azuredocs/containerapps-helloworld:latest
    docker:
      imagePassthrough: true

Altyapınızda, Express değeri properties.environmentMode olarak ayarlanmış bir yönetilen ortam oluşturun. Kapsayıcı uygulamasının bu ortama başvurması ve azd-service-name içindeki hizmet adıyla eşleşen bir azure.yaml etiketi içermesi gerekir:

resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2026-07-01' = {
  name: 'cae-${environmentName}'
  location: location
  properties: {
    environmentMode: 'Express'
  }
}

containerAppsEnvironment.id değeri environmentId olarak ayarlanmış Microsoft.App/containerApps kaynağını tanımlayın. azd-service-name içindeki hizmet adıyla eşleşmesi için web değerine sahip bir azure.yaml etiketi ekleyin.

azd sırasında azd deploy üst ortamın express modunu algılar ve özel bir düzeltme soneki veya trafik ağırlığı ayarlamadan kapsayıcı görüntüsünü güncelleştirir. Express tek düzeltmeli aşamalı güncelleştirmeyi otomatik olarak gerçekleştirir.

express için görüntü tabanlı dağıtım stratejisini kullanın. Revizyon tabanlı strateji, dağıtım Bicep'inizi express için uyarlamaz ve express birden çok revizyonu veya trafiği bölmeyi desteklemez. Altyapınızı tanımlamadan önce geçerli Express özellik kullanılabilirliğini ve sınırlamalarını gözden geçirin.

Görüntü tabanlı dağıtım stratejisi

Bu stratejide kapsayıcı uygulaması yapılandırması sırasında azd provisionoluşturulur ve güncelleştirilirken kapsayıcı görüntüsü sırasında azd deploygüncelleştirilir.

  • Kapsayıcı uygulama tanımı (kaynaklar, ortam değişkenleri, sistem durumu yoklamaları vb.), sağlama sırasında uygulanan bir Bicep modülünde bulunur.
  • Dağıtım sırasında yalnızca kapsayıcı görüntü referansı (containers[0].image) değişir.

Düzeltme davranışı

Uygulama yapılandırmasında veya görüntüsünde yapılan her değişiklik yeni bir düzeltmeyi tetikler:

Step Command Değişiklikleri şunlara uygular: Notes
1 azd provision Ortam değişkenleri, kaynaklar, bağlamalar, yoklamalar, yük dengeleyiciler Yeni bir düzeltme oluşturur
2 azd deploy Kapsayıcı görüntüsü Başka bir düzeltme oluşturur

Her revizyon, Container Apps ortamında ek çoğaltmalar tahsis eder ve bu durum kaynak kullanımını ve maliyeti geçici olarak artırabilir.

Uyarı

Bu stratejide mavi-yeşil veya kanarya gibi gelişmiş dağıtım desenleri desteklenmez.

Görüntü tabanlı dağıtımları yapılandırma

Mevcut bir kapsayıcı uygulamasını en son dağıtılan görüntü üzerine yazmadan güncellemek için azd provision öğesinde bir upsert işlemi gerçekleştirin. Bu desen AVM container-app-upsert modülü tarafından uygulanır ve iki adımdan oluşur:

  1. Sizin main.parameters.json içinde, azd tarafından sağlanan SERVICE_{NAME}_RESOURCE_EXISTS değişkenine başvuran bir parametre tanımlayın. Bu değişken, kaynağın zaten var olup olmadığını belirtmek için azd tarafından sağlama zamanında otomatik olarak ayarlanır.

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environmentName": {
          "value": "${AZURE_ENV_NAME}"
        },
        "location": {
          "value": "${AZURE_LOCATION}"
        },
        // ... other parameters
        "apiExists": {
          "value": "${SERVICE_API_RESOURCE_EXISTS}"
        }
      }
    }
    
  2. Bicep dosyanızda, kapsayıcı uygulamasının oluşturulup oluşturulmayacağını veya güncellenip güncellenmeyeceğini kontrol etmek için exists parametresine başvurun. Modül bu container-app-upsert mantığı dahili olarak kapsüller.

    @description('Indicates whether the container app resource already exists.')
    param apiExists bool
    
    module api 'br/public:avm/ptn/azd/container-app-upsert:0.1.2' = {
      name: 'api'
      params: {
        name: 'my-api'
        location: location
        containerAppsEnvironmentName: containerAppsEnvironment.name
        containerRegistryName: containerRegistry.name
        imageName: !empty(apiImageName) ? apiImageName : ''
        exists: apiExists
        env: [
          {
            name: 'MONGODB_CONNECTION_STRING'
            value: mongodb.outputs.connectionString
          }
        ]
        targetPort: 3100
      }
    }
    

    Bu yaklaşım, kapsayıcı uygulaması kaynağını güvenli bir şekilde upsert (varsa güncelleştir, yoksa oluştur) el ile denetimler olmadan sağlar.

    İpucu

    Bicep modülündeki apiVersion, azure.yaml ile apiVersion'in Microsoft.App/containerApps ilişkin uyumunu koruyun ve uyumsuzluklardan kaçının.

Revizyon tabanlı dağıtım stratejisi

Bu stratejide, hem kapsayıcı uygulama tanımı hem de görüntüsüazd deploy sırasında birlikte dağıtılır.

  • Kapsayıcı uygulama yapılandırması, dağıtım sırasında uygulanan özel bir Bicep modülünde bulunur.

  • Ortam değişkenlerinde, görüntülerde, kaynaklarda ve yük dengeleme ayarlarında yapılan değişiklikler tek bir düzeltme olarak dağıtılır.

    İpucu

    Bu strateji mavi-yeşil, kanarya ve diğer gelişmiş dağıtım desenlerini destekler.

Düzeltme tabanlı dağıtımları yapılandırma

  1. Kapsayıcı uygulama dağıtımını tanımlayın, örneğin infra/api.bicep gibi, hizmetiniz için bir altyapı dosyası oluşturarak. AVM tabanlı modülü kullanarak veya kaynağı doğrudan tanımlayarak kapsayıcı uygulamanızı tanımlayabilirsiniz:

    @description('Unique environment name used for resource naming.')
    param environmentName string
    
    @description('Primary location for all resources.')
    param location string
    
    param containerRegistryName string
    param containerAppsEnvironmentName string
    param imageName string
    param identityId string
    
    resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' existing = {
      name: containerRegistryName
    }
    
    resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-03-01' existing = {
      name: containerAppsEnvironmentName
    }
    
    module api 'br/public:avm/res/app/container-app:0.8.0' = {
      name: 'api'
      params: {
        name: 'api'
        ingressTargetPort: 80
        scaleMinReplicas: 1
        scaleMaxReplicas: 10
        containers: [
          {
            name: 'main'
            image: imageName
            resources: {
              cpu: json('0.5')
              memory: '1.0Gi'
            }
          }
        ]
        managedIdentities: {
          systemAssigned: false
          userAssignedResourceIds: [identityId]
        }
        registries: [
          {
            server: containerRegistry.properties.loginServer
            identity: identityId
          }
        ]
        environmentResourceId: containerAppsEnvironment.id
        location: location
        tags: {
          'azd-env-name': environmentName
          'azd-service-name': 'api'
        }
      }
    }
    
  2. Bir parametre dosyası oluşturarak dağıtım zamanında parametreler sağlayın (örn. api.parameters.json):

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environmentName": { "value": "${AZURE_ENV_NAME}" },
        "location": { "value": "${AZURE_LOCATION}" },
        "containerRegistryName": { "value": "${AZURE_CONTAINER_REGISTRY_NAME}" },
        "containerAppsEnvironmentName": { "value": "${AZURE_CONTAINER_ENVIRONMENT_NAME}" },
        "imageName": { "value": "${SERVICE_API_IMAGE_NAME}" },
        "identityId": { "value": "${SERVICE_API_IDENTITY_ID}" }
      }
    }
    

    Uyarı

    SERVICE_API_IMAGE_NAME dağıtım sırasında dinamik olarak ayarlanır ve sağlama çıkışlarının bir parçası değildir.

    azd deploy'yi çalıştırdığınızda, kapsayıcı uygulama revizyonu yukarıdaki kaynak tanımı kullanılarak uygulanır.

    İpucu

    Kapsayıcı uygulamanız sağlanan diğer kaynaklara başvuruyorsa, azd provision ek çıkışları azd deploy'a parametre olarak iletin.

Karşılaştırma özeti

Görünüş Görüntü tabanlı Revizyon tabanlı
Güncelleştir komutu azd provision + azd deploy azd deploy sadece
Dağıtım türü İki düzeltme Tek düzeltme
Dağıtım denetimi Tarafından yönetilir azd Yapılandırılabilir (mavi-yeşil, kanarya)
Kullanım örneği Basit ortamlar Gelişmiş dağıtımlar
Kapsayıcı uygulama tanımı konumu Bicep tedarik süresi Dağıtım zamanı Bicep

Kapsayıcı Uygulama İşlerini Konumlandırma

Container Apps'e ek olarak, azd Azure Container App jobs (Microsoft.App/jobs) dağıtımlarını da destekler. Kapsayıcı Uygulama İşleri, toplu işleme, zamanlanmış görevler veya olay temelli çalışma gibi tamamen tamamlanana kadar süren görevler için tasarlanmıştır.

Uyarı

Kapsayıcı Uygulama İşleri, host: containerapp içinde aynı azure.yaml ayarını kullanır. Yeni bir konak türü gerekmez. Bicep şablonu, tanımladığınız kaynak türüne göre bir Kapsayıcı Uygulaması mı yoksa Kapsayıcı Uygulama Görevi mi sağlanıp sağlanmadığını belirler.

Nasıl çalışır?

azd ile etiketlenmiş bir iş kaynağını keşfettiğindeazd-service-name, o:

  1. Docker görüntüsünü derler ve Azure Container Registry'ye gönderir (Container Apps ile aynı).
  2. Container Apps API'sinin yerine Container App Jobs API'sini çağırarak işin kapsayıcı görüntüsünü güncelleştirir.
  3. İşlerin girişi olmadığından boş uç noktaları döndürür.

Kapsayıcı Uygulama İşi'nin Dağıtımını Yapılandırma

  1. azure.yaml İş hizmetinizin dosyasını tanımlayın. host: containerapp ve language: docker kullanın:

    name: myapp
    services:
      job:
        host: containerapp
        language: docker
        project: ./src/job
        docker:
          path: ./Dockerfile
          context: .
    
  2. Bicep modülü ile bir Microsoft.App/jobs kaynağı sağlayın. Kaynağı bulabilmesi için azd-service-name ile azd etiketleyin. Parametreler ve mevcut kaynak başvuruları (kapsayıcı kayıt defteri, yönetilen ortam, kimlik) yukarıdaki Container Apps örnekleriyle aynı deseni izler:

    resource job 'Microsoft.App/jobs@2025-02-02-preview' = {
      name: 'job'
      location: location
      tags: {
        'azd-env-name': environmentName
        'azd-service-name': 'job'
      }
      properties: {
        environmentId: containerAppsEnvironment.id
        configuration: {
          replicaTimeout: 300
          replicaRetryLimit: 1
          triggerType: 'Manual'
          registries: [
            {
              server: containerRegistry.properties.loginServer
              identity: identityId
            }
          ]
        }
        template: {
          containers: [
            {
              image: imageName
              name: 'main'
              resources: {
                cpu: json('0.5')
                memory: '1.0Gi'
              }
            }
          ]
        }
      }
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '${identityId}': {}
        }
      }
    }
    

    Önemli

    Etiket azd-service-name değeri dosyanızdaki azure.yaml hizmet adıyla eşleşmelidir. Bu etiket, sağlanan kaynağı hizmetinizle ilişkilendirme yöntemidir azd .

  3. Sağlamak ve dağıtmak için komutunu çalıştırın azd up . CLI, etiketli kaynağın bir Container App İşi olduğunu otomatik olarak algılar ve dağıtımı uygun şekilde işler.

Container Apps'ten önemli farklar

Görünüş Konteyner Uygulamaları Kapsayıcı Uygulama Görevleri
Kaynak türü Microsoft.App/containerApps Microsoft.App/jobs
Giriş/uç noktalar HTTP girişini destekler Giriş yok (boş uç noktalar)
Yürütme modeli Uzun süre çalışan hizmetler Bitene Kadar Çalıştırma Görevleri
Tetikleyici türleri Talep odaklı El ile, zamanlanmış veya olay bazlı
azure.yaml içinde konak ayarı host: containerapp host: containerapp

Ek kaynaklar