使用Heredoc执行kubectl apply报未找到预期'-'指示符但YAML正确
问题根因
- 报错和YAML本身语法无关,核心是未加引号的heredoc标记会触发Shell对内容做特殊语法解析
- 你使用的
<<EOF是heredoc的默认写法,这种模式下Shell会自动解析替换内容里的两类语法:$开头的变量、反引号`或$()包裹的命令 - 你的YAML中message字段包含
`minikube`内容,Shell会把反引号包裹的minikube识别为待执行命令,自动运行minikube命令并将其多行输出替换到该位置 - 替换后的内容完全打乱了原有YAML结构,不仅总长度会暴涨到69行以上,插入的无关内容也不符合YAML列表语法,最终触发解析错误
- 写入独立文件执行时,内容不会经过Shell的解析替换流程,因此可以正常生效。
解决方法
给heredoc的结束标记加上单引号,告诉Shell不要解析heredoc内的任何特殊语法,原封不动将内容传递给kubectl即可,修改后的命令如下:
cat <<'EOF' | kubectl apply -f - apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: max-pods spec: validationFailureAction: audit background: false rules: - name: restrict-pod-count match: resources: kinds: - Pod context: - name: podcounts apiCall: urlPath: "/api/v1/pods" jmesPath: "items[?spec.nodeName=='minikube'] | length(@)" preconditions: any: - key: "{{ request.operation }}" operator: Equals value: "CREATE" validate: message: "A maximum of 10 Pods are allowed on the Node `minikube`" deny: conditions: any: - key: "{{ podcounts }}" operator: GreaterThan value: 10 EOF
这种写法和读取本地YAML文件执行的效果完全一致,不需要修改原有配置内容。后续通过管道传递包含反引号、$变量、模板表达式的配置时,都建议使用
<<'EOF'的写法避免意外解析。
内容的提问来源于stack exchange,提问作者Gaëtan
相关产品推荐
相关产品推荐

