我有一个简单的 bash 脚本,它创建一个容器并在其中运行任务:
api=${1}
az container create \
--resource-group "my_resource_group" \
--file container.yaml \
--environment-variables "APIKEY"="${api}"
但是变量 APIKEY 永远不会从此调用中获取值,而是始终从 container.yaml 中的“默认”值获取值。
如何使用 .yaml 中的整个定义创建容器实例并在命令中传递环境变量
az container create
?
当输入作为文件给出时,不考虑环境变量。
查看cli源码,当使用File时,它只会返回基于文件创建容器。 https://github.com/Azure/azure-cli/blob/713061e3e4a0fc969b0797ec06bd0e3db49ad4a8/src/azure-cli/azure/cli/command_modules/container/custom.py#L112
您可以做的是,在bash脚本中使用sed更改container.yaml文件中的APIKey值,然后按原样部署它。
sed -i 's/PLACEHOLDER_FOR_APIKEY_HERE/$api/g' container.yaml
PLACEHOLDER_FOR_APIKEY_HERE 将替换为命令行参数,container.yaml 文件将更新。
因此脚本将类似于下面的脚本。
api=${1}
sed -i 's/PLACEHOLDER_FOR_APIKEY_HERE/$api/g' container.yaml
az container create \
--resource-group "my_resource_group" \
--file container.yaml
您可以借助 ArmClient 动态创建容器,并且在创建容器时也可以传递动态变量 var req = new ContainerResourceRequestsContent(1.0, 1.0); var containerResourceRequirements = new ContainerResourceRequirements(req);
//Defining container name within the container group along with environment variables
var ExportContainer = new ContainerInstanceContainer($"<Container Name>", "<Container Registry Name>.azurecr.io/<Image Name>", containerResourceRequirements);
ExportContainer.EnvironmentVariables.Add(new ContainerEnvironmentVariable("<Dynamic Environment Variable Name>") { Value = "<Dynamic Value>" });
var containers = new List<ContainerInstanceContainer> { ExportContainer };
var data = new ContainerGroupData(AzureLocation.CentralIndia, containers, ContainerInstanceOperatingSystemType.Linux);
data.RestartPolicy = "OnFailure";
var imageRegistryCredential = new ContainerGroupImageRegistryCredential(@"<Container Registry Name>.azurecr.io")
{
Password = clientSecret,
Username = clientId
};
data.ImageRegistryCredentials.Add(imageRegistryCredential);
string containerGroupName = $"<Container Group Name>";
var result = await containerGroupCollection.CreateOrUpdateAsync(WaitUntil.Completed, containerGroupName, data);
var containerGroup = await containerGroupCollection.GetAsync(containerGroupName).ConfigureAwait(true);
var containerToRemove = containerGroup.Value.Delete(WaitUntil.Completed);