مواصفات قالب AZURE Container Apps ARM وYAML

يشغِّل قالب Azure Resource Manager (ARM) عمليات توزيع Azure Container Apps. تدعم بعض أوامر CLI لـ Container Apps أيضاً استخدام قالب YAML لتحديد مورد.

تتضمن هذه المقالة أمثلة على تكوينات ARM وYAML لموارد Container Apps المستخدمة بشكل متكرر. للحصول على قائمة كاملة بموارد Container Apps، راجع قوالب Azure Resource Manager لتطبيقات الحاوية. التعليمات البرمجية المدرجة في هذه المقالة هي لأغراض المثال فقط. للحصول على المخطط الكامل ومعلومات النوع، راجع تعريفات JSON لإصدار واجهة برمجة التطبيقات المطلوب.

إصدار واجهة برمجة التطبيقات

أحدث إصدارات واجهة برمجة تطبيقات الإدارة لتطبيقات حاوية Azure هي:

لمعرفة المزيد حول الاختلافات بين إصدارات واجهة برمجة التطبيقات، راجع Microsoft.App سجل التغيير.

تحديث إصدارات واجهة برمجة التطبيقات

لاستخدام إصدار API معين في ARM أو Bicep، قم بتحديث الإصدار المشار إليه في القوالب. لاستخدام أحدث إصدار من واجهة برمجة التطبيقات في Azure CLI أو Azure PowerShell، قم بتحديثها إلى أحدث إصدار.

تحديث Azure CLI وملحق Azure Container Apps عن طريق تشغيل الأوامر التالية:

az upgrade
az extension add -n containerapp --upgrade

لتحديث Azure PowerShell، راجع كيفية تثبيت Azure PowerShell.

لإدارة تطبيقات حاوية Azure برمجيا باستخدام أحدث إصدار من واجهة برمجة التطبيقات، استخدم أحدث إصدارات SDK للإدارة:

بيئة Container Apps

تصف الجداول التالية الخصائص شائعة الاستخدام المتوفرة في مورد بيئة Container Apps. للحصول على قائمة كاملة بالخصائص، راجع مرجع Azure Container Apps REST API.

Resource

يتضمن مورد بيئة Container Apps الخصائص التالية:

الخاصية ‏‏الوصف نوع البيانات للقراءة فقط
daprAIInstrumentationKey استخدم Dapr مفتاح تقرير عن حالة النظام لـ Application Insights. سلسلة لا
appLogsConfiguration تكوين تسجيل البيئة. ‏‏الكائن لا
peerAuthentication كيفية تمكين تشفير mTLS. ‏‏الكائن لا

الأمثلة

المثال التالي يقوم مقتطف قالب ARM بنشر بيئة تطبيقات الحاوية.

إشعار

لا تدعم أوامر إنشاء بيئات تطبيق الحاوية إدخال تكوين YAML.

{
  "location": "East US",
  "properties": {
    "appLogsConfiguration": {
      "logAnalyticsConfiguration": {
        "customerId": "string",
        "sharedKey": "string"
      }
    },
    "zoneRedundant": true,
    "vnetConfiguration": {
      "infrastructureSubnetId": "/subscriptions/<subscription_id>/resourceGroups/RGName/providers/Microsoft.Network/virtualNetworks/VNetName/subnets/subnetName1"
    },
    "customDomainConfiguration": {
      "dnsSuffix": "www.my-name.com",
      "certificateValue": "Y2VydA==",
      "certificatePassword": "1234"
    },
    "workloadProfiles": [
      {
        "name": "My-GP-01",
        "workloadProfileType": "GeneralPurpose",
        "minimumCount": 3,
        "maximumCount": 12
      },
      {
        "name": "My-MO-01",
        "workloadProfileType": "MemoryOptimized",
        "minimumCount": 3,
        "maximumCount": 6
      },
      {
        "name": "My-CO-01",
        "workloadProfileType": "ComputeOptimized",
        "minimumCount": 3,
        "maximumCount": 6
      },
      {
        "name": "My-consumption-01",
        "workloadProfileType": "Consumption"
      }
    ],
    "infrastructureResourceGroup": "myInfrastructureRgName"
  }
}

تطبيق الحاوية

تصف الجداول التالية الخصائص شائعة الاستخدام في مورد تطبيق الحاوية. للحصول على قائمة كاملة بالخصائص، راجع مرجع Azure Container Apps REST API.

Resource

يتضمن كائن مورد properties تطبيق الحاوية الخصائص التالية:

الخاصية ‏‏الوصف نوع البيانات للقراءة فقط
provisioningState حالة التشغيل طويل الأمد، على سبيل المثال عند إنشاء مراجعة حاوية جديدة. تتضمن القيم المحتملة: قيد التوفير، ومتوفرة، وغير متوفرة. تحقق مما إذا كان التطبيق قيد التشغيل. سلسلة ‏‏نعم‬
environmentId معرِّف البيئة لتطبيق الحاوية. هذه خاصية مطلوبة لإنشاء تطبيق حاوية. إذا كنت تستخدم YAML، يمكنك تحديد معرف البيئة باستخدام --environment الخيار في Azure CLI بدلا من ذلك. سلسلة لا
latestRevisionName اسم آخر مراجعة. سلسلة ‏‏نعم‬
latestRevisionFqdn عنوان URL لأحدث مراجعة. سلسلة ‏‏نعم‬

تأخذ قيمة environmentId شكل النموذج التالي:

/subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/environmentId/<ENVIRONMENT_NAME>

في هذا المثال، يمكنك وضع قيمك بدلاً من الرموز المميزة للعنصر النائب محاطة بأقواس <>.

properties.configuration

يتضمن كائن المورد properties.configuration الخصائص التالية:

الخاصية ‏‏الوصف نوع البيانات
activeRevisionsMode يؤدي الضبط على single إلى إلغاء تنشيط المراجعات القديمة تلقائياً، ويحافظ على أحدث مراجعة نشطة فقط. يسمح لك الضبط على multiple بالحفاظ على مراجعات متعددة. سلسلة
secrets تعرِّف قيم البيانات السرية في تطبيق الحاوية. كائن
ingress الكائن الذي يحدد تكوين إمكانية الوصول العامة لتطبيق حاوية. كائن
registries كائن التكوين الذي يشير إلى بيانات الاعتماد لسجلات الحاويات الخاصة. تشير الإدخالات المعرفة بـ secretref إلى كائن تكوين البيانات السرية. كائن
dapr كائن التكوين الذي يحدد إعدادات Dapr لتطبيق الحاوية. كائن

التغييرات التي أُجريت على القسم configuration هي تغييرات في نطاق التطبيق، ولا تؤدي إلى مراجعة جديدة.

properties.template

يتضمن كائن المورد properties.template الخصائص التالية:

الخاصية ‏‏الوصف نوع البيانات
revisionSuffix اسم مألوف للمراجعة. يجب أن تكون هذه القيمة فريدة لأن وقت التشغيل يرفض أي تعارضات مع قيم لاحقة اسم المراجعة الموجودة. سلسلة
containers كائن التكوين الذي يحدد صور الحاوية المُضمَّنة في تطبيق الحاوية. كائن
scale كائن التكوين الذي يحدد قواعد المقياس لتطبيق الحاوية. كائن

التغييرات التي أُجريت على القسم template هي تغييرات في نطاق المراجعة، وتؤدي إلى مراجعة جديدة.

الأمثلة

للحصول على تفاصيل حول فحوصات السلامة، راجع فحوصات الصحة في Azure Container Apps.

المثال التالي يوزع مقتطف قالب ARM تطبيق حاوية.

{
  "identity": {
    "userAssignedIdentities": {
      "/subscriptions/<subscription_id>/resourcegroups/my-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-user": {
      }
    },
    "type": "UserAssigned"
  },
  "properties": {
    "environmentId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/managedEnvironments/demokube",
    "workloadProfileName": "My-GP-01",
    "configuration": {
      "ingress": {
        "external": true,
        "targetPort": 3000,
        "customDomains": [
          {
            "name": "www.my-name.com",
            "bindingType": "SniEnabled",
            "certificateId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/managedEnvironments/demokube/certificates/my-certificate-for-my-name-dot-com"
          },
          {
            "name": "www.my-other-name.com",
            "bindingType": "SniEnabled",
            "certificateId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/managedEnvironments/demokube/certificates/my-certificate-for-my-other-name-dot-com"
          }
        ],
        "traffic": [
          {
            "weight": 100,
            "revisionName": "testcontainerApp0-ab1234",
            "label": "production"
          }
        ],
        "ipSecurityRestrictions": [
          {
            "name": "Allow work IP A subnet",
            "description": "Allowing all IP's within the subnet below to access containerapp",
            "ipAddressRange": "192.168.1.1/32",
            "action": "Allow"
          },
          {
            "name": "Allow work IP B subnet",
            "description": "Allowing all IP's within the subnet below to access containerapp",
            "ipAddressRange": "192.168.1.1/8",
            "action": "Allow"
          }
        ],
        "stickySessions": {
          "affinity": "sticky"
        },
        "clientCertificateMode": "accept",
        "corsPolicy": {
          "allowedOrigins": [
            "https://a.test.com",
            "https://b.test.com"
          ],
          "allowedMethods": [
            "GET",
            "POST"
          ],
          "allowedHeaders": [
            "HEADER1",
            "HEADER2"
          ],
          "exposeHeaders": [
            "HEADER3",
            "HEADER4"
          ],
          "maxAge": 1234,
          "allowCredentials": true
        }
      },
      "dapr": {
        "enabled": true,
        "appPort": 3000,
        "appProtocol": "http",
        "httpReadBufferSize": 30,
        "httpMaxRequestSize": 10,
        "logLevel": "debug",
        "enableApiLogging": true
      },
      "maxInactiveRevisions": 10,
      "service": {
        "type": "redis"
      }
    },
    "template": {
      "containers": [
        {
          "image": "repo/testcontainerApp0:v1",
          "name": "testcontainerApp0",
          "probes": [
            {
              "type": "Liveness",
              "httpGet": {
                "path": "/health",
                "port": 8080,
                "httpHeaders": [
                  {
                    "name": "Custom-Header",
                    "value": "Awesome"
                  }
                ]
              },
              "initialDelaySeconds": 3,
              "periodSeconds": 3
            }
          ],
          "volumeMounts": [
            {
              "mountPath": "/myempty",
              "volumeName": "myempty"
            },
            {
              "mountPath": "/myfiles",
              "volumeName": "azure-files-volume"
            },
            {
              "mountPath": "/mysecrets",
              "volumeName": "mysecrets"
            }
              ]
        }
      ],
      "initContainers": [
        {
          "image": "repo/testcontainerApp0:v4",
          "name": "testinitcontainerApp0",
          "resources": {
            "cpu": 0.2,
            "memory": "100Mi"
          },
          "command": [
            "/bin/sh"
          ],
          "args": [
            "-c",
            "while true; do echo hello; sleep 10;done"
          ]
        }
      ],
      "scale": {
        "minReplicas": 1,
        "maxReplicas": 5,
        "rules": [
          {
            "name": "httpscalingrule",
            "custom": {
              "type": "http",
              "metadata": {
                "concurrentRequests": "50"
              }
            }
          }
        ]
      },
      "volumes": [
        {
          "name": "myempty",
          "storageType": "EmptyDir"
        },
        {
          "name": "azure-files-volume",
          "storageType": "AzureFile",
          "storageName": "myazurefiles"
        },
        {
          "name": "mysecrets",
          "storageType": "Secret",
          "secrets": [
            {
              "secretRef": "mysecret",
              "path": "mysecret.txt"
            }
          ]
        }
      ],
      "serviceBinds": [
        {
          "serviceId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/containerApps/redisService",
          "name": "redisService"
        }
      ]
    }
  }
}

مهمة تطبيقات الحاوية

تصف الجداول التالية الخصائص شائعة الاستخدام في مورد وظيفة Container Apps. للحصول على قائمة كاملة بالخصائص، راجع مرجع Azure Container Apps REST API.

Resource

يتضمن كائن مورد properties وظيفة Container Apps الخصائص التالية:

الخاصية ‏‏الوصف نوع البيانات للقراءة فقط
environmentId معرف البيئة لمهمة Container Apps. هذه الخاصية مطلوبة لإنشاء مهمة Container Apps. إذا كنت تستخدم YAML، يمكنك تحديد معرف البيئة باستخدام --environment الخيار في Azure CLI بدلا من ذلك. سلسلة لا

تأخذ قيمة environmentId شكل النموذج التالي:

/subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/environmentId/<ENVIRONMENT_NAME>

في هذا المثال، يمكنك وضع قيمك بدلاً من الرموز المميزة للعنصر النائب محاطة بأقواس <>.

properties.configuration

يتضمن كائن المورد properties.configuration الخصائص التالية:

الخاصية ‏‏الوصف نوع البيانات
triggerType نوع المشغل لمهمة Container Apps. للحصول على تكوين محدد لكل نوع مشغل، راجع أنواع مشغلات الوظائف سلسلة
replicaTimeout المهلة بالثوان لمهمة Container Apps. integer
replicaRetryLimit عدد مرات إعادة محاولة مهمة Container Apps. integer

properties.template

يتضمن كائن المورد properties.template الخصائص التالية:

الخاصية ‏‏الوصف نوع البيانات
containers كائن التكوين الذي يحدد صور الحاوية المضمنة في الوظيفة. كائن
scale كائن التكوين الذي يحدد قواعد المقياس للوظيفة. كائن

الأمثلة

المثال التالي يوزع مقتطف قالب ARM مهمة Container Apps.

{
  "identity": {
    "userAssignedIdentities": {
      "/subscriptions/<subscription_id>/resourcegroups/my-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-user": {
      }
    },
    "type": "UserAssigned"
  },
  "properties": {
    "environmentId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/managedEnvironments/demokube",
    "configuration": {
      "replicaTimeout": 10,
      "replicaRetryLimit": 10,
      "manualTriggerConfig": {
        "replicaCompletionCount": 1,
        "parallelism": 4
      },
      "triggerType": "Manual"
    },
    "template": {
      "containers": [
        {
          "image": "repo/testcontainerAppsJob0:v1",
          "name": "testcontainerAppsJob0",
          "probes": [
            {
              "type": "Liveness",
              "httpGet": {
                "path": "/health",
                "port": 8080,
                "httpHeaders": [
                  {
                    "name": "Custom-Header",
                    "value": "Awesome"
                  }
                ]
              },
              "initialDelaySeconds": 5,
              "periodSeconds": 3
            }
          ],
          "volumeMounts": [
            {
              "mountPath": "/myempty",
              "volumeName": "myempty"
            },
            {
              "mountPath": "/myfiles",
              "volumeName": "azure-files-volume"
            },
            {
              "mountPath": "/mysecrets",
              "volumeName": "mysecrets"
            }
          ]
        }
      ],
      "initContainers": [
        {
          "image": "repo/testcontainerAppsJob0:v4",
          "name": "testinitcontainerAppsJob0",
          "resources": {
            "cpu": 0.2,
            "memory": "100Mi"
          },
          "command": [
            "/bin/sh"
          ],
          "args": [
            "-c",
            "while true; do echo hello; sleep 10;done"
          ]
        }
      ],
      "volumes": [
        {
          "name": "myempty",
          "storageType": "EmptyDir"
        },
        {
          "name": "azure-files-volume",
          "storageType": "AzureFile",
          "storageName": "myazurefiles"
        },
        {
          "name": "mysecrets",
          "storageType": "Secret",
          "secrets": [
            {
              "secretRef": "mysecret",
              "path": "mysecret.txt"
            }
          ]
        }
      ]
    }
  }
}