Golang模板将docker ps输出格式化为JSON



我想知道是否可以添加使该输出成为有效JSON字符串所需的额外格式化。要做到这一点,我需要在开头有一个字符,除了最后一行,每行都有一个,然后是最后一个字符。

我现在有这个;

$ sudo docker ps --format "{ "{{.ID}}" : "{{.Names}}"}"
{ "85c4c597bef9" : "addon_a0d7b954_nodered"}
{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"}
{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}

我不知道如何使用Go在开头只放一个字符(或者即使可能(。

问题是您指定了一个模板,但该模板会单独应用于每个容器,并且每个模板结果都会在新行中呈现。您的模板不适用于项目列表,而是适用于单个项目,结果的输出方式(行的连接方式(不在您的控制范围内。

但是您可以通过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"}
]

尽管我不确定它在嵌套对象中的表现,但一个简单的解决方案可能是这样的。

package main
import (
"encoding/json"
"fmt"
"io"
"log"
"os"
)
func main() {
dec := json.NewDecoder(os.Stdin)
enc := json.NewEncoder(os.Stdout)
fmt.Println("[")
d := map[string]interface{}{}
var i int
for {
err := dec.Decode(&d)
if err != nil {
if err == io.EOF {
break
}
log.Println(err)
continue
}
if i > 0 {
fmt.Println(",")
}
enc.Encode(d)
i++
}
fmt.Println("]")
}

然后,docker ps -a --format "{{json .}}" | jq "{ID, Names}" | go run gow/src/test/jsonl/main.go

jq有帮助。

获取完整的json以供参考。

docker ps -a --format "{{json .}}" | jq -s

使用选项卡分隔版本只获取输出中所需的列

docker ps -a --format "{{json .}}" | jq -r -c '[.ID, .State, .Names, .Image] | @tsv'

最新更新