You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:12:19