В настоящее время я пытаюсь развернуть группу контейнеров внутри Azure Экземпляры контейнеров по шаблону ARM, все они вызываются из Azure Конвейер сборки Devops Yaml. Я обнаружил, что могу использовать предложение copy для создания нескольких групп ресурсов и / или свойств.
Вот мой шаблон ARM
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"containerGroupName": {
"type": "string",
"metadata": {
"description": "Emulators ACR name."
}
},
"copies":{
"type": "int",
"defaultValue": 2,
"metadata": {
"description": "Defines the number of container's copies."
}
},
"server":{
"type": "string",
"metadata": {
"description": "Defines the ACR server url."
}
},
"serverUser":{
"type": "string",
"metadata": {
"description": "Defines the ACR user."
}
},
"serverPassword":{
"type": "string",
"metadata": {
"description": "Defines the ACR password."
}
},
"imageName":{
"type": "string",
"metadata": {
"description": "Defines the ACR repository hosting the image."
}
},
"imageVersion":{
"type": "string",
"metadata": {
"description": "Defines the ACR image version."
}
},
"containerName":{
"type": "string",
"metadata": {
"description": "Defines the ACI containers name. This will be suffixed with the copy index."
}
}
},
"variables": {
"emulatorImage": "[concat(parameters('server'), '/', parameters('imageName'))]",
"emulatorImageVersion": "[parameters('imageVersion')]"
},
"resources": [
{
"name": "[concat(parameters('containerGroupName'), '-', copyIndex(1))]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2018-10-01",
"location": "[resourceGroup().location]",
"copy": {
"name": "acicopy",
"count": "[if(equals(mod(parameters('copies'), 60), 0), div(parameters('copies'), 60), add(div(parameters('copies'), 60), 1))]"
},
"properties": {
"copy": [
{
"name": "containers",
"count": "[if(equals(div(sub(parameters('copies'), mul(60, copyIndex())), 60), 0), if(equals(mod(sub(parameters('copies'), mul(60, copyIndex())), 60), 0), 60, mod(sub(parameters('copies'), mul(60, copyIndex())), 60)), 0)]",
"input": {
"name": "[concat(parameters('containerName'), '-', copyIndex(1), copyIndex('containers', 1))]",
"properties": {
"image": "[concat(variables('emulatorImage'), ':' ,variables('emulatorImageVersion'))]",
"resources": {
"requests": {
"cpu": 0.01,
"memoryInGB": 0.1
}
}
}
}
}
],
"imageRegistryCredentials": [
{
"server": "[parameters('server')]",
"username": "[parameters('serverUser')]",
"password": "[parameters('serverPassword')]"
}
],
"osType": "Linux"
}
}
]
}
Как видите, у меня есть две копии итераций. Первый в RG генерирует достаточно экземпляров контейнеров (поскольку я ограничен 60 контейнерами на ACI), а второй - в свойствах, чтобы генерировать несколько контейнеров (максимум 60).
Итак, если мне нужно 100 контейнеры, я должен создать 2 ACI, первый будет содержать 60 контейнеров, второй 40.
Условия для свойств счетчика copy могут показаться немного сложными для чтения, поэтому здесь C# эквивалентность.
public static void DefineNumber(int number)
{
Console.WriteLine("Number : " + number);
int mainLoop = number % 60 == 0 ? (int)(number / 60) : (int)(number / 60) + 1;
Console.WriteLine("MainLoop : " + mainLoop);
for(int i = 0; i < mainLoop; i++)
{
Console.WriteLine("----");
int div = (number - (60 * i)) / 60;
Console.WriteLine("Div : " + div);
int mod = (number - (60 * i)) % 60;
Console.WriteLine("Mod : " + mod);
int iteration = div == 0 ? (mod == 0 ? 60 : mod) : 60;
Console.WriteLine("Number of containers for main loop n°" + (i+1) + " will be : " + iteration);
}
}
mainl oop предназначена для первой копии итерации
итерации для второго
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что при запросе шаблона на создание 100 контейнеров у меня возникает следующая ошибка сборки
Сообщение достаточно ясное, но я не понимаю, в чем проблема. imageRegistryCredentials свойство определяется один раз для каждой итерации copy и располагается на том же уровне, что и свойство Containers , поэтому почему оно успешно выполняется на первой итерации, а затем завершается с ошибкой