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

How do I parse external JSON file in a Helm _helpers.tpl

我正在写一个 Helm _helpers.tpl 文件。这个帮手需要

  1. 从不在图表 yaml/values 中的文件中读取 JSON 值。
  2. 使用charts/values/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"
    }
  }
}

我的值/图表中有以下变量供我使用

我的 _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 }}

此代码的第一行(上方)是我需要帮助的地方。目前,我

我想我什么都好,除了我在这台电脑上没有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 中的更好方法行。