我正在尝试用helm创建一个kubernetes ConfigMap,它只是由配置文件中的第一行组成。我把我的文件放在helm/config/file.txt
中,它有几行内容,但我只想提取第一行。我的第一次尝试是遍历文件的行(很自然),但在第一次循环后退出:
apiVersion: v1
kind: ConfigMap
metadata:
name: one-line-cm
data:
first-line:
{{- range .Files.Lines "config/file.txt" }}
{{ . }}
{{ break }} # not a real thing
{{- end }}
不幸的是,break
似乎不是helm中的一个概念/功能,即使它在golang中。我发现了这个困难的方式,以及阅读类似的问题在另一个帖子:Helm: break loop (range) in template
我不坚持使用循环,我只是想知道是否有另一种解决方案来执行使用helm语法从文件中提取第一行的简单任务。
编辑:
我已经确定以下是最干净的解决方案:
.Files.Lines "config/file.txt" | first
(作为旁注,由于我的文件内容包含特殊字符,我不得不在实际解决方案中管道到squote
)
在helm文档中寻找替代功能后,我想出了一个可行的解决方案,它只是不那么漂亮:
apiVersion: v1
kind: ConfigMap
metadata:
name: one-line-cm
data:
first-line: |
{{ index (regexSplit "\n" (.Files.Get "config/file.txt") -1) 0 }}
这就是上面发生的事情(从内到外工作):
.Files.Get "config/file.txt"
返回文件内容的字符串表示形式。regexSplit "\n" <step-1> -1
正在用换行符分隔步骤1的文件内容(-1表示返回可能的子字符串匹配的最大数目)index <step-2> 0
从步骤2返回的列表中抓取第一项(索引0)。
希望这能帮助到其他有类似情况的人,我仍然愿意接受其他解决方案的建议。