通过Helm部署CronJob时Shell命令出现语法错误求助
解决CronJob中Shell脚本的语法错误问题
问题场景
尝试使用Helm配置CronJob清理运行成功的旧Pod,配置的jobTemplate部分如下:
jobTemplate: metadata: creationTimestamp: null spec: backoffLimit: 3 template: metadata: creationTimestamp: null spec: containers: - args: - > POD_LIST=($(kubectl get pod --field-selector=status.phase=Succeeded -n ex-namespace -l tekton.dev/pipeline | awk '$5 ~ /(^[6-9][0-9]*|^[1-5][0-9]+)d.*/ {print $1}')); for podname in $POD_LIST; do; echo "deleting pod $podname"; kubectl delete pod -n ex-namespace $podname; done; command: - /bin/sh - '-c' image: kubctlImage imagePullPolicy: IfNotPresent name: cleanup-completed-pods resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Never schedulerName: default-scheduler securityContext: {} serviceAccount: ral-tekton serviceAccountName: ral-tekton terminationGracePeriodSeconds: 30 schedule: 0 0 * * * startingDeadlineSeconds: 200 successfulJobsHistoryLimit: 3
任务触发后,Pod日志中出现错误:
"/bin/sh: 1: Syntax error: "(" unexpected"
注:将命令转为单行后在Mac的/bin/sh中测试运行正常。
问题原因
Mac系统的/bin/sh实际是bash的软链接,支持POD_LIST=($(...))这种数组赋值语法;但容器中的/bin/sh通常是dash(比如Debian/Ubuntu镜像默认的sh),dash不支持这种bash特有的数组语法,因此触发语法错误。
解决方案
方案1:改用bash执行脚本
修改容器的command配置,指定用bash来运行脚本,这样就能兼容数组语法:
command: - /bin/bash - '-c'
方案2:修改脚本兼容dash(推荐)
去掉数组赋值,改用while read循环处理kubectl的输出,这种写法在dash和bash中都能正常运行:
args: - > kubectl get pod --field-selector=status.phase=Succeeded -n ex-namespace -l tekton.dev/pipeline | awk '$5 ~ /(^[6-9][0-9]*|^[1-5][0-9]+)d.*/ {print $1}' | while read -r podname; do echo "deleting pod $podname"; kubectl delete pod -n ex-namespace "$podname"; done;
这样修改后,CronJob就能正常执行清理Pod的操作了。
内容的提问来源于stack exchange,提问作者Olgun Kaya
相关产品推荐
相关产品推荐

