如何将 `false` 值传递给 Helm `default`?

问题描述 投票:0回答:4

我在 Helm 图表中经常看到的一种模式(例如)是将布尔值设置为 default

true
,除非提供了一些覆盖值:

feature_enabled_in_k8s_resource: {{ default true .Values.foo_feature_enabled }}

即 - “如果 foo_feature_enabled

 设置为 Helm 输入中的任何值(通过 
--set
values.yaml
 等),则将 
feature_enabled_in_k8s_resource
 设置为该值 - 否则(如果未设置),将 
feature_enabled_in_k8s_resource
 设置为 
true

但是,我无法按照预期覆盖该值 - 在

false

 中设置 
values.yaml
 值和/或传递 
--set foo_feature_enabled=false
 作为参数,仍然会导致模板保留 
true

我怀疑这是因为

false

 是一个“
falsy”值,因此 default
 将其解析为“需要替换”。

传递字符串值(

"false"

中的
values.yaml
--set-string foo_feature_enabled=false
)确实会出现(从
helm template [...]
输出)将
feature_enabled_in_k8s_resource
设置为
"false"
 - 但尚不清楚这是否会被正确解释由 Kubernetes 产生的实际应用程序(也就是说,它可能将非空字符串解释为“truthy”,使我们回到原来的默认行为)。即使这
有效,它在某种程度上感觉很糟糕,这表明我错过了“正确的”解决方案。

(据推测,

实际修复将是 Helm 图表从不default

true
 - 但这在处理我无法控制的图表时对我没有帮助!)

kubernetes-helm
4个回答
4
投票
使用

ne(不等于)的干净(尽管有点不清楚)解决方案

feature_enabled_in_k8s_resource: {{ ne .Values.foo_feature_enabled false }}

真实假空或空真实假真实真实
.Values.foo_feature_enabled

未指定
feature_enabled_in_k8s_resource


2
投票
您对与

default

 结合使用的“真实性”的理解在这里是正确的:
default
0
false
nil
 和空字符串全部视为“未设置”,并将它们替换为默认值。因此,如果您希望 
.Values.something
 具有布尔值,则 
.Values.something | default true
 将始终为 
true

最少代码的解决方案是在图表的

values.yaml

 文件中指定一个值:

# values.yaml # foo_feature_enabled enables the foo feature. foo_feature_enabled: true
# templates/configmap.yaml
feature_enabled_in_k8s_resource: {{ .Values.foo_feature_enabled }}
现在 

helm install --set foo_feature_enabled=false

 选项将覆盖图表的 
values.yaml
 文件。但如果您没有该选项,则可以使用 
values.yaml
 中的默认值。

如果这不是一个选项,那么您需要显式检查是否在

hasKey 块中使用

if
 设置该值。所有其他简写都有相同的“真实性”检查。

# templates/configmap.yaml feature_enabled_in_k8s_resource: {{- if hasKey .Values "foo_feature_enabled" }} {{ .Values.foo_feature_enabled }} {{- else }} true {{- end }}
    

0
投票
您还可以使用

ternary

功能:

feature_enabled_in_k8s_resource: {{ hasKey .Values "foo_feature_enabled" | ternary .Values.foo_feature_enabled true }}
比使用

ne

长,但一看就很清楚。


-1
投票
Helm 从左到右计算,因此,在它的使用方式中,它将始终设置为 true。传递的值根本不重要。将上面的内容改为:

feature_enabled_in_k8s_resource: {{ .Values.foo_feature_enabled | default true }}
这将首先评估提供的值,如果未提供,将使用默认的真实值。

请参考

在helm中使用管道

© www.soinside.com 2019 - 2024. All rights reserved.