Helm3 - 将 json 文件读入 configmap 会产生一个字符串?
Helm3 - Reading json file into configmap produces a string?
问题:
我想将 json 文件读入配置映射,它看起来像:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{
"key": "val"
}
相反,我得到
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
"{\r\n \"key\": \"val\"\r\n}"
我做了什么:
我有以下舵图:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020-02-06 10:51 AM static
d----- 2020-02-06 10:55 AM templates
-a---- 2020-02-06 10:51 AM 88 Chart.yaml
static/ 包含一个文件:test.json
:
{
"key": "val"
}
templates/ 包含一个读作 test.json 的配置映射:test.yml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{{ toJson ( .Files.Get "static/test.json" ) | indent 4}}
当我 运行 helm install test . --dry-run --debug
我得到以下输出
NAME: test
LAST DEPLOYED: Thu Feb 6 10:58:18 2020
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
{}
HOOKS:
MANIFEST:
---
# Source: sandbox/templates/test.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
"{\r\n \"key\": \"val\"\r\n}"
这里的问题是我的 json 是用双引号引起来的。我想要读取 json 的进程期望实际 json,而不是字符串。
我发现这不仅仅是 helm 3 的特定行为。它通常以这种方式在 kubernetes 中工作。
我刚刚在 kubernetes v1.13.
上测试过
首先我根据这个文件创建了一个ConfigMap
:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{
"key": "val"
}
当我运行:
$ kubectl get configmaps json-test -o yaml
我得到了预期的输出:
apiVersion: v1
data:
test.json: |-
{
"key": "val"
}
kind: ConfigMap
metadata:
...
但是当我基于 json 文件创建我的 ConfigMap
时,其内容如下:
{
"key": "val"
}
来自 运行宁:
$ kubectl create configmap json-configmap --from-file=test-json.json
然后当我运行:
kubectl get cm json-configmap --output yaml
我得到:
apiVersion: v1
data:
test-json.json: " { \n \"key\": \"val\"\n } \n"
kind: ConfigMap
metadata:
...
所以当一个 ConfigMap
是从文件创建的。
这似乎不是一个错误,因为 kubectl 在从 ConfigMap
:
中提取正确格式的 json 格式没有任何问题
kubectl get cm json-configmap -o jsonpath='{.data.test-json\.json}'
给出正确的输出:
{
"key": "val"
}
我会说应用程序有责任从这样的 json 中提取 json 并且它可以是可能以许多不同的方式完成,例如直接调用 kube-api
或使用 serviceaccount
配置为在 Pod
.
中使用 kubectl
问题:
我想将 json 文件读入配置映射,它看起来像:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{
"key": "val"
}
相反,我得到
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
"{\r\n \"key\": \"val\"\r\n}"
我做了什么:
我有以下舵图:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020-02-06 10:51 AM static
d----- 2020-02-06 10:55 AM templates
-a---- 2020-02-06 10:51 AM 88 Chart.yaml
static/ 包含一个文件:test.json
:
{
"key": "val"
}
templates/ 包含一个读作 test.json 的配置映射:test.yml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{{ toJson ( .Files.Get "static/test.json" ) | indent 4}}
当我 运行 helm install test . --dry-run --debug
我得到以下输出
NAME: test
LAST DEPLOYED: Thu Feb 6 10:58:18 2020
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
{}
HOOKS:
MANIFEST:
---
# Source: sandbox/templates/test.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
"{\r\n \"key\": \"val\"\r\n}"
这里的问题是我的 json 是用双引号引起来的。我想要读取 json 的进程期望实际 json,而不是字符串。
我发现这不仅仅是 helm 3 的特定行为。它通常以这种方式在 kubernetes 中工作。
我刚刚在 kubernetes v1.13.
上测试过首先我根据这个文件创建了一个ConfigMap
:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{
"key": "val"
}
当我运行:
$ kubectl get configmaps json-test -o yaml
我得到了预期的输出:
apiVersion: v1
data:
test.json: |-
{
"key": "val"
}
kind: ConfigMap
metadata:
...
但是当我基于 json 文件创建我的 ConfigMap
时,其内容如下:
{
"key": "val"
}
来自 运行宁:
$ kubectl create configmap json-configmap --from-file=test-json.json
然后当我运行:
kubectl get cm json-configmap --output yaml
我得到:
apiVersion: v1
data:
test-json.json: " { \n \"key\": \"val\"\n } \n"
kind: ConfigMap
metadata:
...
所以当一个 ConfigMap
是从文件创建的。
这似乎不是一个错误,因为 kubectl 在从 ConfigMap
:
kubectl get cm json-configmap -o jsonpath='{.data.test-json\.json}'
给出正确的输出:
{
"key": "val"
}
我会说应用程序有责任从这样的 json 中提取 json 并且它可以是可能以许多不同的方式完成,例如直接调用 kube-api
或使用 serviceaccount
配置为在 Pod
.
kubectl