如何从需要模板化的文件目录生成配置映射?

Jam*_*mes 5 kubernetes kubernetes-helm

我可以ConfigMap从目录中生成 ,但它们不会翻译模板指令或值。下面是Release.Namespace模板指令不在ConfigMap.

.
|____Chart.yaml
|____charts
|____.helmignore
|____templates
| |____my-scripts.yaml
|____values.yaml
|____test-files
  |____test1.txt
Run Code Online (Sandbox Code Playgroud)
---
# templates/myscripts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-scripts
  namespace: {{ .Release.Namespace }}
data:
  test.txt: |-
{{ .Files.Get "test-files/test1.txt" | indent 4}}
Run Code Online (Sandbox Code Playgroud)
# test-files/test1.txt
test file
{{ .Release.Namespace }}
Run Code Online (Sandbox Code Playgroud)

当我在helm install . --dry-run --debug --namespace this-should-print这里跑步时,我得到的是什么,而不是我所期待的:

实际的:

---
# Source: test/templates/my-scripts.yaml
# templates/myscripts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-scripts
  namespace: test
data:
  test.txt: |-
    # test-files/test1.txt
    test file
    {{ .Release.Namespace }}
Run Code Online (Sandbox Code Playgroud)

预期的:

---
# Source: test/templates/my-scripts.yaml
# templates/myscripts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-scripts
  namespace: test
data:
  test.txt: |-
    # test-files/test1.txt
    test file
    this-should-print
Run Code Online (Sandbox Code Playgroud)

或者,我会对指定目录中以如下格式输出的每个文件感兴趣:

<filename>: |-
  <content>
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 5

我找到了一种使用 tpl 函数来做到这一点的方法:

---
# templates/myscripts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-scripts
  namespace: {{ .Release.Namespace }}
data:
  test.txt: |-
{{ tpl ( .Files.Get "test-files/test1.txt" ) . | indent 4 }}
Run Code Online (Sandbox Code Playgroud)

新的输出与预期完全一致:

# templates/myscripts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-scripts
  namespace: this-should-print
data:
  test.txt: |-
    # test-files/test1.txt
    test file
    this-should-print
Run Code Online (Sandbox Code Playgroud)

为了获得奖励积分,可以从目录中获取所有文件,而无需在配置映射中更新此列表:

---
# templates/myscripts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-scripts
  namespace: {{ .Release.Namespace }}
data:
{{ tpl (.Files.Glob "groovy-scripts/*").AsConfig . | indent 4 }}
Run Code Online (Sandbox Code Playgroud)