如何解析 Helm _helpers.tpl 中的外部 JSON 文件

发布于 2025-01-11 05:48:39 字数 1267 浏览 0 评论 0原文

我正在编写一个 Helm _helpers.tpl 文件。此帮助器需要

  1. 从不在图表的 yaml/值中的文件读取 JSON 值。
  2. 使用图表/值/yaml 中的变量来确定要读取外部 JSON 的哪个字段
  3. 将从 JSON 中提取的值存储到本地 Go 变量中,
  4. 如果 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

  1. read a JSON value from a file not in the yaml/values of the charts.
  2. Use variables in the charts/values/yaml to determine which field of the external JSON to read
  3. store the value extracted from the JSON into a local Go variable
  4. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

狂之美人 2025-01-18 05:48:39

一旦调用 .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 只能检索图表目录中的文件,而不能检索模板。 (实现实际上预加载了所有非模板文件存储到内存中,并在调用 .Files.Get 时仅返回其中一个。)

一种更简单的方法可能是让部署系统提供完整的映像名称,可能会传递存储库、名称和标记为单独的 Helm 值。您在此处显示的内容看起来像是您正在尝试在没有连接的应用程序的情况下部署本地构建的语言运行时,并且它也可能是使图像字符串成为应用程序图像的 Dockerfile FROM 线。

Once you call .Files.Get to retrieve the file and then call fromJson to parse it, you can then use ordinary Helm templating syntax to navigate within it. You might find the standard index function helpful here: it takes an object and any number of subscripts, and does either map or array lookups on each subscript in turn.

{{-/* 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 }}

This may not fully solve your problem, though. In particular, .Files.Get can only retrieve files that are within the chart directory, but not templates. (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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文