Проблема в том, что вы указываете шаблон, но этот шаблон применяется индивидуально для каждого из ваших контейнеров, и каждый результат шаблона отображается в новой строке. Ваш шаблон применяется не к списку элементов, а к отдельным элементам, и то, как выводится результат (как соединяются строки), не находится под вашим контролем.
Но вы можете достичь того, чего хотите, с помощью 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"}
]