如何解析 Helm _helpers.tpl 中的外部 JSON 文件
我正在编写一个 Helm _helpers.tpl 文件。此帮助器需要
- 从不在图表的 yaml/值中的文件读取 JSON 值。
- 使用图表/值/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"
}
}
}
中有以下变量可供使用,
- 我的值 /Charts .Values.type
- .Values.typeVersion
我的 _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
在这台计算机上。如何在此 Helm Go 模板助手中解析 JSON 并获取所需的值?
I am writing a Helm _helpers.tpl file. This helper needs to
- read a JSON value from a file not in the yaml/values of the charts.
- Use variables in the charts/values/yaml to determine which field of the external JSON to read
- store the value extracted from the JSON into a local Go variable
- combine the values if the Go variable and the chart variables to output into a final value.
My external JSON file looks like this:
{
"java": {
"8": {
"version": "0.1.8"
},
"11": {
"version": "0.1.11"
}
},
"node": {
"14": {
"version": "14.5.0"
},
"16": {
"version": "16.4.0"
}
}
}
I have the following variables at my disposal in my values /Charts
- .Values.type
- .Values.typeVersion
my _helpers.tpl looks like this:
{{- $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 }}
The first line of this code (above) is where I am needing help. Currently, I
- use
.Files.Get
to extract the file contents - ensure it is interpretted as JSON by using
toJson
- try to read the specific field I am interested using
jq
- assign local variable
$imageversions
(far left) to the value found in the JSON
I think I have everything ok, except I don't have jq
on this computer. How can I parse the JSON and get the value I need in this Helm Go template helper?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
一旦调用
.Files.Get
检索文件,然后调用fromJson
解析它,您就可以使用普通的 Helm 模板语法在其中导航。您可能会发现标准index
函数在这里很有用:它接受一个对象和任意数量的下标,并依次对每个下标进行映射或数组查找。但这可能无法完全解决您的问题。特别是,
.Files.Get
只能检索图表目录中的文件,而不能检索模板
。 (实现实际上预加载了所有非模板文件存储到内存中,并在调用.Files.Get
时仅返回其中一个。)一种更简单的方法可能是让部署系统提供完整的映像名称,可能会传递存储库、名称和标记为单独的 Helm 值。您在此处显示的内容看起来像是您正在尝试在没有连接的应用程序的情况下部署本地构建的语言运行时,并且它也可能是使图像字符串成为应用程序图像的 Dockerfile
FROM
线。Once you call
.Files.Get
to retrieve the file and then callfromJson
to parse it, you can then use ordinary Helm templating syntax to navigate within it. You might find the standardindex
function helpful here: it takes an object and any number of subscripts, and does either map or array lookups on each subscript in turn.This may not fully solve your problem, though. In particular,
.Files.Get
can only retrieve files that are within the chart directory, but nottemplates
. (The implementation actually preloads all of the non-template files into memory and just returns one of them when you call.Files.Get
.)A simpler approach may be to have your deployment system supply the complete image name, maybe passing the repository, name, and tag as separate Helm values. What you show here looks like you're trying to deploy a locally-built language runtime without a connected application, and it may also be a better approach to make the image string be the in the application image's Dockerfile
FROM
line.