我们如何覆盖 helm chart Chart.yaml 文件中的依赖项 "version"?

How can we override dependencies "version" in helm chart Chart.yaml file?

我想知道并且显然还没有找到任何地方是否有一种方法可以专门覆盖 Helm 中依赖关系表中“version”键值的值

# Chart.yaml
dependencies:
- name: bitnami/postgresql
  version: **"8.10.5"**
  repository: "https://charts.bitnami.com/bitnami"

我试过如下:

# Chart.yaml
dependencies:
- name: bitnami/postgresql
  version: "{{.Values.postgresql.version}}"
  repository: "https://charts.bitnami.com/bitnami"

# Values.yaml
postgreSQL:
  version: "8.10.5" 

但我遇到以下错误:

Error: cannot load Chart.yaml: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.postgresql.version":interface {}(nil)}

如果目前无法做到这一点,那么有人可以建议您如何在新版本可用时更新 Charts.yaml 中依赖项的“版本”吗?

您的方法行不通,因为模板引擎 ({{ .Values.myvar }}) 仅在模板文件夹中有效。

 # Chart.yaml
 dependencies:
 - name: bitnami/postgresql
   version: "{{.Values.postgresql.version}}" # Won't be replaced
   repository: "https://charts.bitnami.com/bitnami"

恐怕 helm 团队不会根据此讨论更改此行为: https://github.com/helm/helm/issues/2492

显然我能想到的唯一方法是用 shell 脚本替换版本,然后调用 helm commando。

 sed -i 's/version: "[0-9].[0-9].[0-9]"/version: "9.9.9"/' Chart.yaml
 helm install ....

在 Helm 文档中没有很好的记录——通用 helm dependency command documentation mentions it, but not the main discussion of chart dependencies – but the version: field is optional, and it uses semantic versioning if it is present. Helm maintains a separate Chart.lock file that lists precise versions of chart dependencies, and the helm dependency update 命令将更新该文件。

所以对于您的用途,您可能会说:

dependencies:
- name: bitnami/postgresql
  version: '^8' # Any 8.x.x version, but not version 7 or 9
  repository: "https://charts.bitnami.com/bitnami"

或者,如果您根本不配置依赖关系表,则完全省略 version: 行并使用最新版本。

# Install the chart using the specific Chart.lock version
helm install myservice .

# Get a newer version in Chart.lock and upgrade the database
rm Chart.lock
helm dependency update
helm upgrade myservice .

务必将 Chart.lock 文件检查到源代码管理中,以便您拥有可重现的部署。

如果您使用的是旧的、与 Helm v2 兼容的布局,该布局在单独的 requirements.yaml 文件中列出依赖项,则所有这些也是正确的。在这种情况下,锁定文件是 requirements.lock,但 version: 仍然是语义版本约束,并且相同的 helm dependency 命令更新锁定文件。