- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在使用 Azure Batch,并且需要在虚拟机上使用 Windows Docker 容器。
这是通过 C# API 完成的:
private static VirtualMachineConfiguration ConfigureVM()
{
var imageNames = new List<string> { "microsoft/dotnet-framework:4.7" };
var containerConfig = new ContainerConfiguration
{
ContainerImageNames = imageNames
};
var offer = "WindowsServer";
var publisher = "MicrosoftWindowsServer";
var imageSku = "2016-Datacenter-with-Containers";
var imageReference = new ImageReference(offer, publisher, imageSku);
var nodeSku = "batch.node.windows amd64";
var vmConfig = new VirtualMachineConfiguration(imageReference, nodeSku)
{
ContainerConfiguration = containerConfig
};
return vmConfig;
}
现在我们正在自动化部署,因此我想通过 ARM 模板执行相同的操作(这是 Azure Batch 帐户的子资源,因此名称和类型都可以):
"resources": [
{
"name": "Test",
"type": "pools",
"apiVersion": "2017-09-01",
"properties": {
"vmSize": "STANDARD_A1",
"deploymentConfiguration": {
"virtualMachineConfiguration": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2016-Datacenter-with-Containers"
},
"nodeAgentSkuId": "batch.node.windows amd64",
"containerConfiguration": {
"imageNames": [ "microsoft/dotnet-framework:4.7" ]
}
}
}
}
}
]
这不起作用。部署时,我得到:
Could not find member 'containerConfiguration' on object of type 'VirtualMachineConfiguration'.
Path 'properties.deploymentConfiguration.virtualMachineConfiguration.containerConfiguration'
没有containerConfiguration
部分,事情就可以工作了——我得到了带有docker的虚拟机,只是没有图像。我明白为什么会发生这种情况 - 模板 does not与 .NET class 相比,具有此属性.
那么...有什么解决方法吗?我想模板与功能不同步的情况已经不是第一次了。
最佳答案
在最近的更新中,Batch 的 ARM 提供程序得到了改进,以允许创建支持容器的池。以下ARM模板将创建一个容器池,注意API版本已更新。
{
"type": "Microsoft.Batch/batchAccounts/pools",
"name": "[concat(variables('batchAccountName'), '/', parameters('poolID'))]",
"apiVersion": "2018-12-01",
"scale": null,
"properties": {
"vmSize": "[parameters('virtualMachineSize')]",
"networkConfiguration": {
"subnetId": "[parameters('virtualNetworkSubnetId')]"
},
"maxTasksPerNode": 1,
"taskSchedulingPolicy": {
"nodeFillType": "Spread"
},
"deploymentConfiguration": {
"virtualMachineConfiguration": {
"containerConfiguration": {
"containerImageNames": "[parameters('dockerImagesToCache')]",
"type": "DockerCompatible"
},
"imageReference": {
"publisher": "microsoft-azure-batch",
"offer": "ubuntu-server-container",
"sku": "16-04-lts",
"version": "latest"
},
"nodeAgentSkuId": "batch.node.ubuntu 16.04"
}
},
"scaleSettings": {
"autoScale": {
"evaluationInterval": "PT5M",
"formula": "[concat('startingNumberOfVMs = 0;maxNumberofVMs = ', parameters('maxNodeCount'), ';pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(160 * TimeInterval_Second);pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(160 * TimeInterval_Second));$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);')]"
}
}
},
"dependsOn": [
"[resourceId('Microsoft.Batch/batchAccounts', variables('batchAccountName'))]"
]
}
----- 现在不需要以前的答案 -----
我设法使用 ACI 容器以及托管服务身份和一些 Python 找到了解决方法。它不漂亮,但确实有效。
模板流程如下:
az cli
,然后继续创建池。 这是完整的设置,您可能需要对其进行调整以适合您的场景。
python脚本和pool.json
文件需要上传到公共(public)位置,比如blob存储或者git,那么_artifactLocation
参数用于告诉模板下载文件的位置。
主模板:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"_artifactsLocation": {
"type": "string",
"metadata": {
"description": ""
}
},
"_artifactsLocationSasToken": {
"type": "string",
"metadata": {
"description": ""
}
},
"mountArgs": {
"type": "string",
"metadata": {
"description": "Arguments passed to the mount.py script."
}
},
"virtualNetworkSubnetId": {
"type": "string",
"metadata": {
"description": "The subnet in which Batch will be deployed. Requires the following ports to be enabled via NSG: https://learn.microsoft.com/en-us/azure/batch/batch-virtual-network#network-security-groups-1."
}
},
"maxTasksPerNode": {
"type": "int",
"defaultValue": 1
},
"maxNodeCount": {
"type": "int",
"defaultValue": 3
},
"virtualMachineSize": {
"type": "string",
"defaultValue": "Standard_F8s_v2",
"metadata": {
"description": "Size of VMs in the VM Scale Set."
}
},
"storageAccountSku": {
"type": "string",
"defaultValue": "Standard_LRS",
"allowedValues": [
"Standard_LRS",
"Standard_GRS",
"Standard_ZRS",
"Premium_LRS"
],
"metadata": {
"description": "Storage Account type"
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for all resources."
}
},
"poolId": {
"type": "string",
"defaultValue": "defaultpool"
}
},
"variables": {
"identityName": "batchpoolcreator",
"storageAccountName": "[concat('batch', uniqueString(resourceGroup().id))]",
"batchAccountName": "[concat('batch', uniqueString(resourceGroup().id))]",
"batchEndpoint": "[concat('https://', variables('batchAccountName'), '.' , parameters('location'), '.batch.azure.com')]",
"_comment": "The role assignment ID is required to be a guid, we use this to generate a repeatable guid",
"roleAssignmentIdRg": "[guid(concat(resourceGroup().id, 'contributorRG'))]",
"_comment": "This is the ID used to set the contributor permission on a role.",
"contributorRoleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]"
},
"resources": [
{
"comments": "Create an identity to use for creating the Azure Batch pool with container support (will be assigned to ACI instance)",
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"name": "[variables('identityName')]",
"apiVersion": "2015-08-31-preview",
"location": "[resourceGroup().location]"
},
{
"comments": "Assign the idenity contributor rights to the resource group",
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2017-05-01",
"name": "[variables('roleAssignmentIdRg')]",
"dependsOn": [
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
],
"properties": {
"roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
"principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')), '2015-08-31-preview').principalId]",
"scope": "[resourceGroup().id]"
}
},
{
"comments": "This is the storage account used by Azure Batch for file processing/storage",
"type": "Microsoft.Storage/storageAccounts",
"name": "[variables('storageAccountname')]",
"apiVersion": "2016-01-01",
"location": "[parameters('location')]",
"sku": {
"name": "[parameters('storageAccountsku')]"
},
"kind": "Storage",
"tags": {
"ObjectName": "[variables('storageAccountName')]"
},
"properties": {}
},
{
"type": "Microsoft.Batch/batchAccounts",
"name": "[variables('batchAccountName')]",
"apiVersion": "2015-12-01",
"location": "[parameters('location')]",
"tags": {
"ObjectName": "[variables('batchAccountName')]"
},
"properties": {
"autoStorage": {
"storageAccountId": "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
}
},
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2018-10-01",
"name": "[substring(concat('batchpool', uniqueString(resourceGroup().id)), 0, 20)]",
"location": "[resourceGroup().location]",
"dependsOn": [
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]",
"[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentIdRg'))]",
"[resourceId('Microsoft.Batch/batchAccounts', variables('batchAccountName'))]"
],
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]": {}
}
},
"properties": {
"osType": "Linux",
"restartPolicy": "Never",
"containers": [
{
"name": "azure-cli",
"properties": {
"image": "microsoft/azure-cli",
"command": [
"/bin/bash",
"-c",
"[concat('curl -fsSL ', parameters('_artifactsLocation'), '/azurebatch/configurepool.py', parameters('_artifactsLocationSasToken'), ' > configurepool.py && python3 ./configurepool.py \"', parameters('poolId'), '\" ', parameters('virtualMachineSize'), ' \"', parameters('mountArgs'), '\" ', parameters('_artifactsLocation'), ' ', parameters('_artifactsLocationSasToken'), ' ', parameters('virtualNetworkSubnetId'), ' ', parameters('maxNodeCount'), ' ', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')), ' ', resourceGroup().name, ' ', variables('batchAccountName'))]"
],
"resources": {
"requests": {
"cpu": 1,
"memoryInGB": 1
}
}
}
}
]
}
}
],
"outputs": {
"storageAccountName": {
"type": "string",
"value": "[variables('storageAccountName')]"
},
"batchAccountName": {
"type": "string",
"value": "[variables('batchAccountName')]"
},
"batchEndpoint": {
"type": "string",
"value": "[variables('batchEndpoint')]"
},
"batchAccountKey": {
"type": "securestring",
"value": "[listKeys(resourceId('Microsoft.Batch/batchAccounts', variables('batchAccountName')), '2017-09-01').primary]"
},
"batchPoolId": {
"type": "string",
"value": "[parameters('poolId')]"
}
}
}
池.json
{
"id": "POOL_ID_HERE",
"vmSize": "VM_SIZE_HERE",
"enableAutoScale": true,
"autoScaleFormula": "startingNumberOfVMs = 0;maxNumberofVMs = MAX_NODE_COUNT_HERE;pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(160 * TimeInterval_Second);pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(160 * TimeInterval_Second));$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);",
"autoScaleEvaluationInterval": "PT5M",
"enableInterNodeCommunication": false,
"startTask": {
"commandLine": "/usr/bin/python3 mount.py MOUNT_ARGS_HERE",
"resourceFiles": [
{
"blobSource": "ARTIFACT_LOCATION_HERE/examplemountscript/script.pyARTIFACT_SAS_HERE",
"filePath": "./mount.py",
"fileMode": "777"
}
],
"userIdentity": {
"autoUser": {
"scope": "pool",
"elevationLevel": "admin"
}
},
"maxTaskRetryCount": 0,
"waitForSuccess": true
},
"maxTasksPerNode": 1,
"taskSchedulingPolicy": {
"nodeFillType": "Spread"
},
"virtualMachineConfiguration": {
"containerConfiguration": {
"containerImageNames": [
"ubuntu",
"python"
]
},
"imageReference": {
"publisher": "microsoft-azure-batch",
"offer": "ubuntu-server-container",
"sku": "16-04-lts",
"version": "1.0.6"
},
"nodeAgentSKUId": "batch.node.ubuntu 16.04"
},
"networkConfiguration": {
"subnetId": "SUBNET_ID_HERE"
}
}
配置池.py:
import subprocess
import sys
import urllib.request
def run_az_command(cmdArray):
try:
print("Attempt run {}".format(cmdArray))
subprocess.check_call(cmdArray)
print("Install completed successfully")
except subprocess.CalledProcessError as e:
print("Failed running: {} error: {}".format(cmdArray, e))
exit(4)
if len(sys.argv) != 11:
print(
"Expected 'poolid', 'vm_size', 'mount_args', 'artifact_location', 'artifact_sas', 'subnet_id', 'max_node_count', 'msi_name', 'resource_group_name' , 'batch_account_name'"
)
exit(1)
pool_id = str(sys.argv[1])
vm_size = str(sys.argv[2])
mount_args = str(sys.argv[3])
artifact_location = str(sys.argv[4])
artifact_sas = str(sys.argv[5])
subnet_id = str(sys.argv[6])
max_node_count = str(sys.argv[7])
msi_name = str(sys.argv[8])
resource_group_name = str(sys.argv[9])
batch_account_name = str(sys.argv[10])
url = "{0}/azurebatch/pool.json{1}".format(artifact_location, artifact_sas)
response = urllib.request.urlopen(url)
data = response.read()
text = data.decode("utf-8")
# Replace the target string
text = text.replace("POOL_ID_HERE", pool_id)
text = text.replace("VM_SIZE_HERE", vm_size)
text = text.replace("MOUNT_ARGS_HERE", mount_args)
text = text.replace("ARTIFACT_LOCATION_HERE", artifact_location)
text = text.replace("ARTIFACT_SAS_HERE", artifact_sas)
text = text.replace("SUBNET_ID_HERE", subnet_id)
text = text.replace("MAX_NODE_COUNT_HERE", max_node_count)
# Write the file out again
with open("pool.complete.json", "w") as file:
file.write(text)
run_az_command(["az", "login", "--identity", "-u", msi_name])
run_az_command(["az", "batch", "account", "login", "--name", batch_account_name, "-g", resource_group_name])
run_az_command(["az", "batch", "pool", "create", "--json-file", "pool.complete.json"])
关于azure - 如何通过 ARM 模板设置 Azure Batch 池容器配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51083254/
我开发了一个 spring batch 应用程序,它使用批处理/shell 脚本部署为可执行 jar。它工作正常。 最近我读到有关 spring batch admin 应用程序发布的信息。根据他们的
我想要的是一个 bat 文件来等待一定时间的输入。如果没有输入,我希望它转到 somethingidk。 这是我目前所拥有的。 @echo off :START cls timeout 10 set
我最近尝试在不使用外部命令或工具的情况下批量编写一个程序来计算任何实数(而不是负数)的平方根,该程序基于可以在这里找到的算法:Link1 编辑:我修复了大部分问题,但仍然有一个我没有发现的轻微问题。
我有一个简单的批处理文件,它将遍历所有* Test.htm文件并进行复制。一些文件将包含我不想复制的字符串。 FOR /R "C:\" %%g IN (*Test.htm) DO ( echo %%
这可能简短而有趣,但我只是在检查。 批处理 for 命令可以有一个递增的步长值吗? @echo off SetLocal EnableDelayedExpansion set xyz=200 for
目前我正处于批处理 hell 中。我想通过批处理文件调用我的 powershell 脚本。只要路径中没有空格,这就可以正常工作。例如,这是有效的 set DATAPATH="%~1
试图找到以前是否有人问过这个问题,但找不到。 问题来了。以下必须通过Spring批处理来实现有一个文件需要读取和处理。项目阅读器不是线程安全的。计划是让多线程同质处理器和多线程同质写入器插入由单线程读
这里有同样的问题- Spring batch pause/resume vs stop/restart 我在 Spring 检查了 BatchStatus 枚举,没有可用的状态 PAUSED,它仅作为
因此,我目前有这批使用 ffmpeg 将当前文件夹上的每个 .MTS 转换为 .MP4,但是当它完成后,我会在文件夹中同时获得 .mp4 和 .mts。 我有 2 个批处理,一个用于转换文件,另一个用
我需要每周一次将 CSV 加载到数据库中。由于 CSV 文件包含 2 个表的数据,因此需要进行一些数据处理。因此,我将不得不稍微处理一下 CSV 文件,可能会将其转换为 2 个不同的 CSV 文件并将
我有一个澄清。 我们是否可以同时运行一个作业的多个实例。 目前,我们在任何给定时间都有一个作业实例。 如果可能,请告诉我如何做。 最佳答案 是的你可以。 Spring Batch 根据 JobPara
我想跳过一些过程记录。 我尝试过的是,我创建了自定义异常并在我想跳过记录时抛出异常,并且它调用了 onSkipInProcess 方法的跳过监听器。它工作正常。 请找到配置。
任何人都可以启发我一种方法来阻止我的 bat 在执行时在屏幕上闪烁吗?有没有办法阻止 CMD 窗口执行此操作???? 最佳答案 只是一个猜测,但要防止窗口在看不到打印内容的情况下立即打开和关闭,请在批
我需要一个批处理文件来向 windows 中的主机文件添加一条记录,但是我不需要只添加文件,因为我想检查该记录是否已经存在。有可能吗? 最佳答案 type "%SystemRoot%\system32
我试图了解 Spring Batch 如何进行事务管理。这不是技术问题,而是概念问题:Spring Batch 使用什么方法以及该方法的后果是什么? 让我试着澄清一下这个问题。例如,查看 Taskle
我需要知道如何从用户输入的文件中提取目录信息,以下面的代码为例: ECHO Drag and drop your .txt file here, after that press Enter: SET
首先是问题陈述:我在我的 DEV 环境中使用 Spring-Batch 很好。当我将代码移至生产环境时,我遇到了问题。在我的 DEV 环境中,Spring-Batch 能够毫无问题地在我们的 DB2
你好 我是 Spring Batch 领域的新手,最近几天我花了一些时间观看 Michael Minella 的 youtube 视频,阅读了一些文档并成功运行了我在互联网上找到的一些演示项目。我认为
我正在研究使用 spring 批处理来处理编码压缩文件中的记录。记录是可变长度的,其中编码了嵌套的可变长度数据字段。 我是 Spring 和 Spring Batch 的新手,这就是我计划构建批处理配
我正在尝试批量删除字符串中的第一个单词。 示例:“这个 child 喜欢批处理”到“ child 喜欢批处理” 我试过: @echo off set /p text=text: for /f "tok
我是一名优秀的程序员,十分优秀!