问题在于您指定了一个模板,但该模板是在每个容器上单独应用的,每个模板结果都会在新行中呈现。您的模板不适用于项目列表,而是适用于单个项目,输出结果的方式(如何连接行)不在您的控制范围之内。
但是,您可以通过Linux命令实现所需功能。
以下代码演示了如何执行您的模板:
src := "{ \"{{.ID}}\" : \"{{.Names}}\"}"
t := template.Must(template.New("").Parse(src))
ps := []map[string]string{
{"ID": "85c4c597bef9", "Names": "addon_a0d7b954_nodered"},
{"ID": "ec3c55af0497", "Names": "addon_a0d7b954_appdaemon"},
{"ID": "63e3081fbe42", "Names": "addon_a0d7b954_logviewer"},
}
for _, p := range ps {
if err := t.Execute(os.Stdout, p); err != nil {
panic(err)
}
fmt.Println()
}
这将输出您当前的内容(在
Go Playground上试一试)。
{ "85c4c597bef9" : "addon_a0d7b954_nodered"}
{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"}
{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}
您可以使用paste
命令将这些行用逗号连接起来,如下所示:
docker ps --format "{ \"{{.ID}}\" : \"{{.Names}}\"}" |paste -sd','
最后一件事:在开头加上[
并在结尾加上]
,这样它就成为一个有效的JSON数组。
要将某些内容附加到命令的输出中,可以使用
echo something | (command && cat)
为了避免echo
产生的换行符,您可以使用echo -n
。
因此,您“期望”的输出是一系列附加项:]
附加到docker
的输出中,然后再附加到单个[
的输出中。
所以,在您的情况下解决方案是:
echo ] | (docker ps --format "{ \"{{.ID}}\" : \"{{.Names}}\"}" | paste -sd',' && cat) | (echo [ && cat)
这将输出:
[
{ "85c4c597bef9" : "addon_a0d7b954_nodered"},{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"},{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}
]
{{ json .ID }}
只是将该值转换为有效的 JSON,它并没有输出完整的 JSON 字符串(即对象数组)。 - Brian{{json .}}
吗? - user4466350echo ] | (sudo docker ps --format "{{json .}}" | paste -sd',' && cat) | (echo [ && cat)
- Briandocker ps -a --format "{{json .}}" | jq "{ID, Names}" | jq -s
。 我无法避免调用两次jq,但这很好用。 - user4466350