我有一个值。带有一个字符串变量的Yaml文件,该字符串变量表示数据库连接字符串,不带引号,如下所示(别担心,不是真正的密码):
ActionLogsConnectionString: Database=ActionLogs;Server=SQL_DEV;User Id=sa;Password=Y19|yxdySh53&h
我的目标是在ConfigMap资源中打印它,以便它可以作为dotnet应用程序的.json配置文件注入到我的pod中。我还想在连接字符串中附加应用程序名称:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "asp.fullname" . }}
labels:
{{- include "asp.labels" . | nindent 4 }}
data:
appsettings.k8s.json: |-
{
"ConnectionStrings": {
"ActionLogsConnectionString": "{{ .Values.ActionLogsConnectionString }};Application Name=Asp;"
}
}
结果如下:
"ActionLogsConnectionString": "Database=ActionLogs;Server=SQL_DEV;User Id=sa;Password=Y19|yxdySh53&h;Application Name=Asp;"
看起来太棒了!在这一点上,我没有报价问题。
现在的问题,斜杠没有转义json文件格式。很好,我们提供了一个toJson函数。不幸的是,它也改变了&;&;&;到unicode值。然后我找到了toRawJson,它给出了预期的结果。
我的问题是,当使用toJson或toRawJson时,它会添加额外的引号并破坏我的结果:
那么这个yalm文件:
"ActionLogsConnectionString": "{{ .Values.ActionLogsConnectionString | toRawJson }};Application Name=Asp;"
导致这个json文件(注意额外的引号):
"ActionLogsConnectionString": ""Database=ActionLogs;Server=SQL_DEV;User Id=sa;Password=Y19|yx\dySh53&h";Application Name=Asp;"
我看到有一个名为| quote的函数,但这只添加了一些。没有办法使用toRawJson没有添加任何?
在这里使用toJson
或toRawJson
是错误的解决方案,因为根据定义,字符串的JSON表示包含双引号。"foo"
是一个JSON字符串,foo
不是有效的JSON。
但是您只处理标量值,因此首先将其封送到JSON中没有多大意义。我认为以下内容可以满足你的需求:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "asp.fullname" . }}
labels:
{{- include "asp.labels" . | nindent 4 }}
data:
appsettings.k8s.json: |-
{
"ConnectionStrings": {
"ActionLogsConnectionString": {{ printf "%s;Application Name=asp" .Values.ActionLogsConnectionString | quote }}
}
}
在这里,我们使用printf
来生成所需的字符串(然后将其传递给quote
函数以正确引用)。
这产生:
---
# Source: example/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-example-fullname
labels:
# This is a test
data:
appsettings.k8s.json: |-
{
"ConnectionStrings": {
"ActionLogsConnectionString": "Database=ActionLogs;Server=SQL_DEV;User Id=sa;Password=Y19|yx\dySh53&h;Application Name=asp"
}
}