簡體   English   中英

Golang 模板將 docker ps output 格式化為 JSON

[英]Golang template to format docker ps output as JSON

我想知道是否可以添加使此 output 成為有效 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','

最后一件事:添加一個[和 append a ] ,這樣它就變成了一個有效的 JSON 數組。

到 append 命令的 output,您可以使用

echo something | (command && cat)

要省略由echo引起的換行符,您可以使用echo -n

So your "wished" output is a series of appends: ] to the output of docker , and that to the output of the single [ .

因此,您的解決方案是:

echo ] | (docker ps --format "{ \"{{.ID}}\" : \"{{.Names}}\"}" | paste -sd',' && cat) | (echo [ && cat)

這將 output:

[
{ "85c4c597bef9" : "addon_a0d7b954_nodered"},{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"},{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}
]

一個 go-ish 解決方案可能看起來像這樣,盡管我不確定它在嵌套對象中的表現如何。

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 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

僅獲取 output 中所需的列,使用制表符分隔的版本

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM