如何在 Helm _helpers.tpl 中解析外部 JSON 文件
How do I parse external JSON file in a Helm _helpers.tpl
我正在写一个 Helm _helpers.tpl 文件。这个帮手需要
- 从不在图表 yaml/values 中的文件中读取 JSON 值。
- 使用charts/values/yaml中的变量来确定要读取外部JSON的哪个字段
- 将从JSON中提取的值存储到本地Go变量
- 将 Go 变量和图表变量的值合并输出为最终值。
我的外部 JSON 文件如下所示:
{
"java": {
"8": {
"version": "0.1.8"
},
"11": {
"version": "0.1.11"
}
},
"node": {
"14": {
"version": "14.5.0"
},
"16": {
"version": "16.4.0"
}
}
}
我的值/图表中有以下变量供我使用
- .Values.type
- .Values.type版本
我的 _helpers.tpl 看起来像这样:
{{- $imageversions := (.Files.Get "../../../../common/versions.json" | toJson | jq ".".Values.type".".Values.typeVersion"."version) -}}
{{- printf "artifactory.myco.com/docker/%s/ubuntu20-slim-%s%s.0f:%s" .Values.type .Values.type .Values.typeVersion $imageversions }}
此代码的第一行(上方)是我需要帮助的地方。目前,我
- 使用
.Files.Get
提取文件内容
- 使用
toJson
确保将其解释为 JSON
- 尝试使用
jq
阅读我感兴趣的特定字段
- 将局部变量
$imageversions
(最左边)分配给在 JSON 中找到的值
我想我什么都好,除了我在这台电脑上没有jq
。我如何解析 JSON 并在此 Helm Go 模板助手中获取我需要的值?
一旦您调用 .Files.Get
检索文件然后调用 fromJson
解析它,您就可以使用普通的 Helm 模板语法在其中导航。您可能会发现标准 index
函数在这里很有用:它接受一个对象和任意数量的下标,然后依次对每个下标进行映射或数组查找。
{{-/* Get the contents of the file */-}}
{{- $versions := .Files.Get "common/versions.json" | fromJson -}}
{{-/* Extract the specific image tag from it */-}}
{{- $tag := index $versions .Values.type .Values.typeVersion "version" -}}
{{-/* Construct the complete image name */-}}
{{- printf "artifactory.myco.com/docker/%s/ubuntu20-slim-%s%s.0f:%s" .Values.type .Values.type .Values.typeVersion $tag }}
不过,这可能无法完全解决您的问题。特别是,.Files.Get
只能检索图表目录中的文件,而不能检索 templates
。 (implementation 实际上将所有 non-template 文件预加载到内存中,并且当您调用 .Files.Get
时仅 returns 其中之一。)
一种更简单的方法可能是让您的部署系统提供完整的图像名称,可能将存储库、名称和标签作为单独的 Helm 值传递。您在此处显示的内容看起来像是您正在尝试在没有连接的应用程序的情况下部署 locally-built 语言运行时,这也可能是使图像字符串成为应用程序图像的 Dockerfile FROM
中的更好方法行。
我正在写一个 Helm _helpers.tpl 文件。这个帮手需要
- 从不在图表 yaml/values 中的文件中读取 JSON 值。
- 使用charts/values/yaml中的变量来确定要读取外部JSON的哪个字段
- 将从JSON中提取的值存储到本地Go变量
- 将 Go 变量和图表变量的值合并输出为最终值。
我的外部 JSON 文件如下所示:
{
"java": {
"8": {
"version": "0.1.8"
},
"11": {
"version": "0.1.11"
}
},
"node": {
"14": {
"version": "14.5.0"
},
"16": {
"version": "16.4.0"
}
}
}
我的值/图表中有以下变量供我使用
- .Values.type
- .Values.type版本
我的 _helpers.tpl 看起来像这样:
{{- $imageversions := (.Files.Get "../../../../common/versions.json" | toJson | jq ".".Values.type".".Values.typeVersion"."version) -}}
{{- printf "artifactory.myco.com/docker/%s/ubuntu20-slim-%s%s.0f:%s" .Values.type .Values.type .Values.typeVersion $imageversions }}
此代码的第一行(上方)是我需要帮助的地方。目前,我
- 使用
.Files.Get
提取文件内容 - 使用
toJson
确保将其解释为 JSON
- 尝试使用
jq
阅读我感兴趣的特定字段
- 将局部变量
$imageversions
(最左边)分配给在 JSON 中找到的值
我想我什么都好,除了我在这台电脑上没有jq
。我如何解析 JSON 并在此 Helm Go 模板助手中获取我需要的值?
一旦您调用 .Files.Get
检索文件然后调用 fromJson
解析它,您就可以使用普通的 Helm 模板语法在其中导航。您可能会发现标准 index
函数在这里很有用:它接受一个对象和任意数量的下标,然后依次对每个下标进行映射或数组查找。
{{-/* Get the contents of the file */-}}
{{- $versions := .Files.Get "common/versions.json" | fromJson -}}
{{-/* Extract the specific image tag from it */-}}
{{- $tag := index $versions .Values.type .Values.typeVersion "version" -}}
{{-/* Construct the complete image name */-}}
{{- printf "artifactory.myco.com/docker/%s/ubuntu20-slim-%s%s.0f:%s" .Values.type .Values.type .Values.typeVersion $tag }}
不过,这可能无法完全解决您的问题。特别是,.Files.Get
只能检索图表目录中的文件,而不能检索 templates
。 (implementation 实际上将所有 non-template 文件预加载到内存中,并且当您调用 .Files.Get
时仅 returns 其中之一。)
一种更简单的方法可能是让您的部署系统提供完整的图像名称,可能将存储库、名称和标签作为单独的 Helm 值传递。您在此处显示的内容看起来像是您正在尝试在没有连接的应用程序的情况下部署 locally-built 语言运行时,这也可能是使图像字符串成为应用程序图像的 Dockerfile FROM
中的更好方法行。