次のようなHELM値ファイルがあります。
service:
environment: dev
spring_application_json: >-
{
"spring" : {
"boot" : {
"admin" : {
"client" : {
"enabled" : "false",
"url" : "http://website1",
"instance" : {
"service-base-url" : "http://website2",
"management-base-url" : "http://website3"
}
}
}
}
}
}
そして、この値を取得してコンテナに環境変数として挿入する、対応するテンプレートファイル。
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
imagePullSecrets:
- name: {{ .Values.image.pullSecret }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: ENVIRONMENT
value: "{{ .Values.service.environment }}"
- name: SPRING_APPLICATION_JSON
value: "{{ .Values.service.spring_application_json }}"
しかし、helm installを実行すると、次のエラーが発生します。
Error: YAML parse error on deployment.yaml: error converting YAML to JSON: yaml: line 40: did not find expected key
どちらが線を指しているか:
value: "{{ .Values.service.spring_application_json }}"
私はjson文字列を複数行の環境変数として解析しようとしている方法に問題があると思いますか? ENVIRONMENT 'dev'変数は完全に機能し、この同じYAMLはdocker-composeでも完全に機能します。
spring cloud dataflow のドキュメントにこのような例が少しありますが、それらのドキュメントの形式では引用符がエスケープされています。
値ファイルのエントリを次のように変更することで、エラーを再現してそれを乗り越えることができました。
service:
spring_application_json:
{
"spring" : {
"boot" : {
"admin" : {
"client" : {
"enabled" : "false",
"url" : "http://website1",
"instance" : {
"service-base-url" : "http://website2",
"management-base-url" : "http://website3"
}
}
}
}
}
}
そして、デプロイメントエントリは:
- name: SPRING_APPLICATION_JSON
value: {{ .Values.service.spring_application_json | toJson | quote }}
とにかく処理されるため、この部分を囲む引用符はありません。