Kubernetes CronJob -使用嵌套JSON和命令替换来转义cURL命令

iswrvxsc  于 2023-05-16  发布在  Kubernetes
关注(0)|答案(2)|浏览(241)

下面是Kubernets CronJob的定义:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: myCronJob
spec:
  schedule: "*/1 * * * *"
  failedJobsHistoryLimit: 1
  successfulJobsHistoryLimit: 1
  jobTemplate:
    spec:
      backoffLimit: 2
      parallelism: 1
      template:
        metadata:
          annotations:
            linkerd.io/inject: disabled
        spec:
          containers:
            - name: myCronJob
              image: curlimages/curl:7.72.0
              env:
                - name: CURRENT_TIME
                  value: $(date +"%Y-%m-%dT%H:%M:%S.%sZ")
              args:
                - /bin/sh
                - -ec
                - "curl --request POST --header 'Content-type: application/json' -d '{\"Label\":\"myServiceBusLabel\",\"Data\":\"{\'TimeStamp\':\'$(echo $CURRENT_TIME)\'}\",\"QueueName\":\"myServiceBusQueue\"}' https://mycronjobproxy.net/api/HttpTrigger?code=mySecretCode"
          restartPolicy: OnFailure

请注意,我通过环境变量向curl传递了一个动态日期,如here所述。
但是,这会在运行时产生一个错误(从K9 s复制):

curl: (3) unmatched close brace/bracket in URL position 26:                                                                                                                    
+"%Y-%m-%dT%H:%M:%S.%sZ")}","QueueName":"myServiceBusQueue"}
                         ^

我怀疑这可能是组合双引号和单引号以及转义字符的问题。curl命令在macOS上本地运行良好,但在使用curlimages/curl:7.72.0部署时就不行了。他们的行为似乎有些不同。
在macOS上,在我的本地开发机器上,我可以这样运行命令:

curl --request POST --header "Content-type: application/json" -d "{'Label':'myServiceBusLabel','Data':{'TimeStamp':'$(echo $CURRENT_TIME)'},'QueueName':'myServiceBusQueue'}" https://mycronjobproxy.net/api/HttpTrigger?code=mySecretCode

输出:

Message was successfully sent using the following params: Label = myServiceBusLabel | Data = {"TimeStamp": "2023-05-15T15:44:45.1684158285Z"} | QueueName = myServiceBusQueue%

但是当我在我的K8s CronJob YAML文件中使用该版本时,我的IDE(JetBrains Rider)说:“需要标量值。”看起来整个命令必须用双引号括起来。
如何正确引用/转义curl命令?

yizd12fk

yizd12fk1#

JSON数据周围的内部双引号应使用反斜杠(\”)进行转义

"curl --request POST --header 'Content-type: application/json' -d '{\"Label\":\"myServiceBusLabel\",\"Data\":\"{\'TimeStamp\':\'$(echo $CURRENT_TIME)\'}\",\"QueueName\":\"myServiceBusQueue\"}' https://mycronjobproxy.net/api/HttpTrigger?code=mySecretCode"
w6lpcovy

w6lpcovy2#

我已经做了必要的改变,你的 curl 下面可以尝试一次,让我知道:

- “curl --request POST --header ‘Content-type: application/json’ -d \"{\"Label\":\"myServiceBusLabel\",\"Data\":\"{\'TimeStamp\':\'$(echo $CURRENT_TIME)\'}\",\"QueueName\":\"myServiceBusQueue\"}\" https://mycronjobproxy.net/api/HttpTrigger?code=mySecretCode”

在YAML Lint中检查时,它工作正常,附上截图。你能检查一次并试着复制它吗?

相关问题