Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

docker and format json

Tags:

json

bash

docker

I'm trying to get usable json from the docker cli, however it seems it will only produce json for individual items, and not the complete result, as a whole.

For example, running docker container ls -a --format="{{ json .Names }}" produces:

"hopeful_payne"
"trusting_turing"
"stupefied_morse"
"unruffled_noyce"
"pensive_fermi"
"objective_neumann"
"confident_bhaskara"
"unruffled_cray"
"epic_newton"
"boring_bartik"
"priceless_sinoussi"
"naughty_grothendieck"
"hardcore_bose"
"sad_jones"
"optimistic_napier"
"trusting_stallman"
"xenodochial_dijkstra"
"pedantic_cocks"

The above is not json.

How can I produce a result that is, ideally, a json array?

like image 257
Magick Avatar asked Sep 05 '26 03:09

Magick


1 Answers

I think you cannot do this using docker only.

The command-line's format function is effectively taking each input line (one for each container) and applying the Go template to it. So you need another tool to aggregate the lines into a JSON array.

One way that you can achieve your goal is using the excellent jq tool:

docker container ls --format="{\"name\":\"{{.Names}}\"}" --all | jq --slurp

This generates each container line as a JSON string: {"name": "[VALUE]"} and then uses jq to slurp them into a JSON array.

A challenge doing this directly in bash is JSON's stricture that the last element in a list can't be terminated with a ,. So, the following simple bash script generates invalid JSON and you'd need extra logic to remove it (or better yet, not add the last one):

echo "[$(for CONTAINER in $(docker container ls --format="{{.Names}}" --all); do echo "{\"name\":\"${CONTAINER}\"},"; done;)]"
like image 130
DazWilkin Avatar answered Sep 06 '26 22:09

DazWilkin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!