Argo Workflow使用curl镜像调用REST接口无法获取返回HTTP状态码问题
可能的原因及解决方案
curl请求未完成就提前退出
curl遇到域名解析失败、网络不可达、请求参数格式错误、鉴权Header格式非法等致命问题时,会直接终止运行,-w指定的状态码输出逻辑不会执行,$()捕获到的标准输出为空,因此http_response变量是空值。
可在脚本开头添加set -eux开启调试模式,查看Argo对应Pod的运行日志即可定位curl的具体报错。YAML模板转义异常导致curl参数失效
配置中的"是HTML转义后的双引号,经过Argo模板渲染后可能出现引号不匹配、%{http_code}被误转义的问题,导致-w参数不生效,curl不会输出状态码到标准输出。
可在脚本中新增一行打印实际渲染后的curl命令验证参数是否正确:
echo "实际执行的curl命令: curl -X DELETE -w \"%{http_code}\" -o /mnt/out/rest_output.txt https://myurl/{{workflow.parameters.id}} -H \"Authorization:Bearer {{inputs.parameters.token}}\""
- curl错误信息未被捕获
curl的报错默认输出到标准错误流,而$()默认仅捕获标准输出流的内容,你可以在curl命令末尾添加2>&1将标准错误重定向到标准输出,即可捕获到完整的返回内容,排查是请求错误还是状态码输出问题:
http_response=$(curl -X DELETE -w "%{http_code}" -o /mnt/out/rest_output.txt https://myurl/{{workflow.parameters.id}} -H "Authorization:Bearer {{inputs.parameters.token}}" 2>&1)
修复后的参考配置
script: image: curlimages/curl:latest command: - sh source: > set -eux # 打印渲染后的命令用于排查 echo "curl -X DELETE -w \"%{http_code}\" -o /mnt/out/rest_output.txt https://myurl/{{workflow.parameters.id}} -H \"Authorization:Bearer {{inputs.parameters.token}}\"" http_response=$(curl -X DELETE -w "%{http_code}" -o /mnt/out/rest_output.txt https://myurl/{{workflow.parameters.id}} -H "Authorization:Bearer {{inputs.parameters.token}}" 2>&1) echo $http_response > /mnt/out/http_response.txt volumeMounts: - name: out mountPath: /mnt/out volumes: - name: out emptyDir: {}
内容的提问来源于stack exchange,提问作者Eduard Nickel
相关产品推荐
相关产品推荐

