Докер и формат JSON - PullRequest
       2

Докер и формат JSON

1 голос
/ 09 апреля 2019

Я пытаюсь получить пригодный для использования json из docker cli, однако, похоже, он будет генерировать json только для отдельных элементов, а не для полного результата.

Например, запускdocker container ls -a --format="{{ json .Names }}" производит:

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

Выше не json.

Как получить результат, который в идеале является массивом json?

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Я думаю, что вы не можете сделать это, используя только docker.

Функция format командной строки эффективно берет каждую строку ввода (по одной для каждого контейнера) и применяет к ней шаблон Go.Поэтому вам нужен еще один инструмент для объединения строк в массив JSON.

Один из способов достижения вашей цели - использование превосходного инструмента jq:

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

Это генерирует каждую строку контейнера в виде строки JSON: {"name": "[VALUE]"}, а затем использует jq для превращения их в массив JSON.

Сложность при выполнении этого непосредственно в bash заключается в том, что JSON ограничивается тем, что последний элемент всписок нельзя завершить с помощью ,.Итак, следующий простой скрипт bash генерирует недопустимый JSON, и вам потребуется дополнительная логика для его удаления (или еще лучше, не добавляйте последний):

echo "[$(for CONTAINER in $(docker container ls --format="{{.Names}}" --all); do echo "{\"name\":\"${CONTAINER}\"},"; done;)]"
0 голосов
/ 20 апреля 2019

в качестве альтернативы вы также можете попробовать jsonizing ваш вывод с помощью утилиты unix на основе пешеходной дорожки jtc:

bash $ docker container ls -a --format="{{ json .Names }}" | jtc -J
[
   "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"
]
bash $ 

(Обратите внимание, я создал пример cli, но вход был взят из вашего образца)

0 голосов
/ 09 апреля 2019

Что вы пытаетесь сделать с этими ответами JSON? Возможно, проще будет просто напрямую связаться с Docker API, который даст вам ответы JSON напрямую. Например, чтобы получить список контейнеров:

curl --unix-socket /var/run/docker.sock http://localhost/v1.24/containers/json

Вы можете, как предложил DazWilkin, использовать jq для фильтрации JSON в командной строке. Например, если нам нужен список имен контейнеров:

curl --unix-socket /var/run/docker.sock http://localhost/v1.24/containers/json |
jq '[.[]|.Names]'

Документацию по Docker API можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...