【问题标题】:How to parse .env file (dotenv) with Helm template?如何使用 Helm 模板解析 .env 文件(dotenv)?
【发布时间】:2021-05-20 14:10:34
【问题描述】:

我正在从 Docker 迁移到 Helm3。我的 Docker 部署使用 .env 文件加载环境变量,请参阅reference。在迁移过程中,我需要同时支持旧方式和新方式,所以如果可以避免的话,我不想更改 .env 格式。

这是我的示例 .env 文件:

key1=value1
key2=value2

然后在我的 Helm3 deployment.yaml 中我需要:

kind: Deployment
spec:
  template:
    spec:
      containers:
          env:
            - name: key1
              value: "value1"
            - name: key2
              value: "value2"

.env 文件是 helm 项目根目录,所以我希望我可以根据 question 做类似的事情,但不知道如何继续:

  {{- $files := .Files }}
  #Not sure how to select just one file?
  {{- range tuple ".env" }}
  
      #Split file by newlines and =
      {{- range $line := splitList "\n" $files.Get . }}
        {{/* Break the line into words */}}
        {{- $kv := splitList "=" $line -}}
        {{- $k := first $kv -}}
        {{ $k }}: {{ last $kv | quote }}
      {{- end }}

  {{- end }}

【问题讨论】:

  • 不能引用templates目录下的.Files;您需要将文件移动到其他地方。 Helm 文档中的Accessing Files Inside Templates 包含有关.Files 的更多信息,包括如何检索特定文件。
  • 谢谢 - 在下面改进了我的答案

标签: docker kubernetes environment-variables kubernetes-helm


【解决方案1】:

这对我有用,但我愿意接受更好的答案。 我唯一不明白的是为什么我需要空行 {{""}} - 我认为没有它就会插入新行。

我对@Matt 的回答的问题是缩进出错了。

{{ $file := .Files.Get ".env" | trimSuffix "\n" }}
{{- range $line := splitList "\n" $file -}}
{{- $kv := splitList "=" $line -}}
    {{ "" }}
    - name: {{ first $kv }}
      value: {{ last $kv | quote }}
{{- end }}

【讨论】:

    【解决方案2】:

    这是我想出的。

    kind: Deployment
    spec:
      template:
        spec:
          containers:
            env:
    {{ $files := .Files }}
    {{- range tuple ".env" -}}
        {{- $file := $files.Get . | trimSuffix "\n" -}}
        {{- range $line := splitList "\n" $file -}}
          {{- $kv := splitList "=" $line -}}
          {{- $k := first $kv -}}
          {{- $v := last $kv -}}
          {{- printf "- name: \"%s\"\n" $k | indent 8 }}
          {{- printf "  value: \"%s\"\n" $v }}
        {{- end }}
    {{- end }}
    

    假设 .env 文件放在 helm 项目根目录中,它应该可以复制粘贴

    我使用以下 .env 文件对其进行了测试:

    key1=value1
    key2=value2
    

    并得到以下 yaml 作为输出:

    ---
    kind: Deployment
    spec:
      template:
        spec:
          containers:
            env:
            - name: "key1"
              value: "value1"
            - name: "key2"
              value: "value2"
    

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 2020-12-09
      • 1970-01-01
      • 2018-06-05
      • 2015-12-11
      • 2020-01-31
      • 2021-11-12
      • 2022-08-16
      • 2021-02-19
      相关资源
      最近更新 更多