亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 docker ps 輸出格式化為 JSON 的 Golang 模板

將 docker ps 輸出格式化為 JSON 的 Golang 模板

Go
收到一只叮咚 2022-06-01 16:14:43
我想知道是否可以添加使此輸出成為有效 JSON 字符串所需的其他格式。為此,我需要在開始時使用一個字符,除最后一行之外的每一行都需要一個字符,然后是最后一個字符。我目前有這個;$ sudo docker ps --format "{ \"{{.ID}}\" : \"{{.Names}}\"}"{ "85c4c597bef9" : "addon_a0d7b954_nodered"}{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"}{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}我無法弄清楚如何使用 Go 在開始時輸出一個字符(或者即使有可能)。
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

問題是您指定了一個模板,但該模板單獨應用于每個容器,并且每個模板結果都呈現在新行中。您的模板不適用于項目列表,但適用于單個項目,并且結果的輸出方式(行的連接方式)不在您的控制范圍內。


但是你可以用 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','

最后一件事:添加 a[并附加 a]使其成為有效的 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"}

]


查看完整回答
反對 回復 2022-06-01
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

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


查看完整回答
反對 回復 2022-06-01
  • 2 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號