在使用参数时,Azure API for App Container的作业会覆盖所有环境变量
我正在通过REST API调用Azure Container Apps的作业。
我的请求体看起来是这样的:curl --location 'https://management.azure.com/subscriptions/xxx/resourceGroups/xxxx/providers/Microsoft.App/jobs/xxxxxx/start?api-version=2026-01-01' \
--header 'Content-Type: application/json' \
--header 'Authorization: ••••••' \
--data '{
"containers": [
{
"name": "xxx-job",
"image": "xxxx.azurecr.io/xxx/xxx-job:latest",
"command": ["python"],
"args": [
"-m",
"myjob.main",
"--period-id",
"xxxxx",
"--job-type",
"preprocessing"
],
"env": [
{
"name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
"value": "xxxx"
},
{
"name": "LOG_LEVEL",
"value": "DEBUG"
}
]
}
]
}
然而,像这样调用时,我收到了缺少环境变量(ENV变量)的错误提示。不过,我并不认为需要提供项目中定义的所有ENV变量?
我甚至尝试不在请求体中指定 "env" 部分,但问题仍然存在。这对我来说毫无意义,因为我本来就希望该作业能够读取预定义的ENV变量。
我在这里看到了类似的错误报告,链接如下 https://github.com/azure/azure-sdk-for-net/issues/50899
我使用这个API调用来启动容器作业:https://learn.microsoft.com/en-us/rest/api/resource-manager/containerapps/jobs/start?view=rest-resource-manager-containerapps-2026-01-01&tabs=HTTP
有人能给出建议吗?
解决方案
这是Container Apps作业启动覆盖的预期行为。不要只发送你想要修改的参数/环境变量。传递给 /jobs/{jobName}/start 的请求体会被视为执行模板,而不是对现有作业模板的补丁。如果你想在一次运行中覆盖参数,请先读取现有的作业模板:
GET .../providers/Microsoft.App/jobs/{jobName}?api-version=2026-01-01
取 properties.template,保留所有现有的容器/环境/资源等,仅修改 containers[0].args,然后将得到的模板以POST方式发送到 /start。
如果你想按原样使用该作业,请在没有覆盖请求体的情况下调用 /start。