具有自定义值文件的 Nil 指针评估接口
Nil pointer evaluating interface with custom values file
我正在制作一个包含多个子图表的伞状图表。
在顶层,我有一个文件 values-ext.yaml,其中包含一些在子图表中使用的值。
sql:
common:
host: <SQL Server host>
user: <SQL user>
pwd: <SQL password>
这些设置在子图表的 configmap.yaml 中读取。在这种情况下,SQL 服务器连接字符串是根据这些设置构建的。
apiVersion: v1
kind: ConfigMap
metadata:
name: "childchart-config"
labels:
app: some-app
chart: my-child-chart
data:
ConnectionStrings__DbConnection: Server={{ .Values.sql.common.host }};Database=some-db
我像这样从伞形图目录中测试图表:helm template --values values-ext.yaml .
它给了我这个错误:
executing "my-project/charts/child-chart/templates/configmap.yaml" at <.Values.sql.common.host>:
nil pointer evaluating interface {}.host
所以,它显然无法从 values-ext.yaml 文件中找到我想要读取的值。
我应该能够像这样传递额外的值文件,对吧?
我也尝试过 $.Values.sql.common.host
但它似乎并不重要。
这是怎么回事?
渲染子图表时,它们的 .Values
是 a subset of the parent chart values。使用 $.Values
来“转义”当前范围根本不会影响这一点。所以在 child-chart
中,.Values 实际上指的是 .Values.child-chart
在父级中所指的内容。
您可以为此做三件事:
在 YAML 文件中将设置下移一级;您必须为每个子图表重复它们,但它们可以不加修改地使用。
child-chart:
sql:
common: { ... }
将设置移动到 global:
键下。所有引用此值的图表都必须引用 .Values.global.sql...
,但它在父图表和子图表中保持一致。
global:
sql:
common: { ... }
ConnectionStrings__DbConnection: Server={{ .Values.global.sql.common.host }};...
在父图表中创建ConfigMap,并在子图表中间接引用它。了解所有图表都将作为同一 Helm 版本的一部分进行安装会有所帮助,如果您使用标准的 {{ .Release.Name }}-{{ .Chart.Name }}-suffix
命名模式,则 .Release.Name
在所有上下文中都是相同的.
# in a child chart, that knows it's being included by the parent
env:
- name: DB_CONNECTION
valueFrom:
configMapKeyRef:
name: '{{ .Release.Name }}-parent-dbconfig'
key: ConnectionStrings__DbConnection
我正在制作一个包含多个子图表的伞状图表。 在顶层,我有一个文件 values-ext.yaml,其中包含一些在子图表中使用的值。
sql:
common:
host: <SQL Server host>
user: <SQL user>
pwd: <SQL password>
这些设置在子图表的 configmap.yaml 中读取。在这种情况下,SQL 服务器连接字符串是根据这些设置构建的。
apiVersion: v1
kind: ConfigMap
metadata:
name: "childchart-config"
labels:
app: some-app
chart: my-child-chart
data:
ConnectionStrings__DbConnection: Server={{ .Values.sql.common.host }};Database=some-db
我像这样从伞形图目录中测试图表:helm template --values values-ext.yaml .
它给了我这个错误:
executing "my-project/charts/child-chart/templates/configmap.yaml" at <.Values.sql.common.host>:
nil pointer evaluating interface {}.host
所以,它显然无法从 values-ext.yaml 文件中找到我想要读取的值。
我应该能够像这样传递额外的值文件,对吧?
我也尝试过 $.Values.sql.common.host
但它似乎并不重要。
这是怎么回事?
渲染子图表时,它们的 .Values
是 a subset of the parent chart values。使用 $.Values
来“转义”当前范围根本不会影响这一点。所以在 child-chart
中,.Values 实际上指的是 .Values.child-chart
在父级中所指的内容。
您可以为此做三件事:
在 YAML 文件中将设置下移一级;您必须为每个子图表重复它们,但它们可以不加修改地使用。
child-chart: sql: common: { ... }
将设置移动到
global:
键下。所有引用此值的图表都必须引用.Values.global.sql...
,但它在父图表和子图表中保持一致。global: sql: common: { ... }
ConnectionStrings__DbConnection: Server={{ .Values.global.sql.common.host }};...
在父图表中创建ConfigMap,并在子图表中间接引用它。了解所有图表都将作为同一 Helm 版本的一部分进行安装会有所帮助,如果您使用标准的
{{ .Release.Name }}-{{ .Chart.Name }}-suffix
命名模式,则.Release.Name
在所有上下文中都是相同的.# in a child chart, that knows it's being included by the parent env: - name: DB_CONNECTION valueFrom: configMapKeyRef: name: '{{ .Release.Name }}-parent-dbconfig' key: ConnectionStrings__DbConnection