kubectl 返回无法将字符串解组为 map[string]interface {} 类型的 Go 值
kubectl returning cannot unmarshal string into Go value of type map[string]interface {}
我正在尝试使用 kubectl 修补一个秘密
kubectl patch secret operator-secrets --namespace kube-system --context=cluster1 --patch "'{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}'"
但是我收到错误
Error from server (BadRequest): json: cannot unmarshal string into Go value of type map[string]interface {}
如果我运行命令使用echo,它似乎是有效的JSON
$ echo "'{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}'"
'{"data": {"FOOBAR": "value that I want"}}'
可以是什么?
发现错误
kubectl patch secret operator-secrets --namespace kube-system --context=standard-cluster-1 --patch "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"
If I run the command using echo, it seems to be a valid JSON
其实不然。仔细看输出的第一个字符:
'{"data": {"FOOBAR": "value that I want"}}'
您的“JSON”字符串以单引号开头,这是一个无效字符。要获得有效的 JSON,您需要将命令重写为如下所示:
echo "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"
我们可以使用 jq
之类的东西来确认 JSON 是有效的
命令:
$ echo "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}" | jq .
{
"data": {
"FOOBAR": "value that i want"
}
}
让你的补丁命令看起来像:
kubectl patch secret operator-secrets \
--namespace kube-system \
--context=cluster1 \
--patch "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"
但是虽然该补丁现在有效 JSON,但它仍然会失败
一个新错误:
The request is invalid: patch: Invalid value: "map[data:map[FOOBAR:value that i want]]": error decoding from json: illegal base64 data at input byte 5
data
地图中项目的值必须是 base64 编码值。
您可以自己对值进行 base64 编码:
kubectl patch secret operator-secrets \
--namespace kube-system \
--context=cluster1 \
--patch "{\"data\": {\"FOOBAR\": \"$(base64 <<<"$FOOBAR")\"}}"
或使用stringData
代替:
kubectl patch secret operator-secrets \
--namespace kube-system \
--context=cluster1 \
--patch "{\"stringData\": {\"FOOBAR\": \"$FOOBAR\"}}"
我正在尝试使用 kubectl 修补一个秘密
kubectl patch secret operator-secrets --namespace kube-system --context=cluster1 --patch "'{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}'"
但是我收到错误
Error from server (BadRequest): json: cannot unmarshal string into Go value of type map[string]interface {}
如果我运行命令使用echo,它似乎是有效的JSON
$ echo "'{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}'"
'{"data": {"FOOBAR": "value that I want"}}'
可以是什么?
发现错误
kubectl patch secret operator-secrets --namespace kube-system --context=standard-cluster-1 --patch "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"
If I run the command using echo, it seems to be a valid JSON
其实不然。仔细看输出的第一个字符:
'{"data": {"FOOBAR": "value that I want"}}'
您的“JSON”字符串以单引号开头,这是一个无效字符。要获得有效的 JSON,您需要将命令重写为如下所示:
echo "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"
我们可以使用 jq
之类的东西来确认 JSON 是有效的
命令:
$ echo "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}" | jq .
{
"data": {
"FOOBAR": "value that i want"
}
}
让你的补丁命令看起来像:
kubectl patch secret operator-secrets \
--namespace kube-system \
--context=cluster1 \
--patch "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"
但是虽然该补丁现在有效 JSON,但它仍然会失败 一个新错误:
The request is invalid: patch: Invalid value: "map[data:map[FOOBAR:value that i want]]": error decoding from json: illegal base64 data at input byte 5
data
地图中项目的值必须是 base64 编码值。
您可以自己对值进行 base64 编码:
kubectl patch secret operator-secrets \
--namespace kube-system \
--context=cluster1 \
--patch "{\"data\": {\"FOOBAR\": \"$(base64 <<<"$FOOBAR")\"}}"
或使用stringData
代替:
kubectl patch secret operator-secrets \
--namespace kube-system \
--context=cluster1 \
--patch "{\"stringData\": {\"FOOBAR\": \"$FOOBAR\"}}"