Yq: получить имена ключей объектов
У меня есть файл YAML (файл docker-compose в моем случае), который выглядит следующим образом:
networks:
foo:
some_opts: "covfefe"
bar:
some_opts: "such wow"
services:
apache:
image: 'apache:1.0.0'
restart: always
mysql:
image: 'mysql:1.0.0'
restart: always
php:
image: 'php'
restart: always
Я хотел бы извлечь название услуги благодаря yq
эквивалент jq
но для YAML, чтобы иметь этот вывод:
"apache"
"mysql"
"php"
В настоящее время я могу добиться этого следующим образом:
$ cat docker-compose.yml | yq '.services' | yq 'keys[]'
"apache"
"mysql"
"php"
Даже если это работает, двойной трубопровод yq
кажется странным для меня. Я думаю, что я делаю это неправильно.
Вопрос: есть ли способ добиться этого с помощью одного yq
команда?
Я попробовал это без успеха, черпая вдохновение в этом вопросе:
$ cat docker-compose.yml | yq '.services.keys[]'
jq: error: Cannot iterate over null
1 ответ
keys
это встроенная функция в jq
когда дан объект, возвращает его ключи в массиве. Так что это на самом деле не отдельно от вашего yaml (не собственность), что означает, что вы не можете сделать services.keys
,
Чтобы получить ключи вы можете сделать следующее:
Мы получим объект services
в первой части, то мы передаем его keys
который вернет список ключей на основе заданного объекта
cat docker-compose.yml | yq '.services | keys'
Или вот так (без кота и трубы)
yq '.services | keys' docker-compose.yml
Выход будет:
[
"apache",
"mysql",
"php"
]
Чтобы избавиться от скобок:
yq '.services | keys[]' docker-compose.yml
Выход:
"apache"
"mysql"
"php"
Для получения более подробной информации вы можете проверить встроенные операторы и функции в jq
, Обратите внимание, что yq
это обертка для jq
поэтому документация jq
было бы полезно в качестве помощи yq
рекомендую.
Поскольку вы просто хотите перечислить сервисы из файла docker-compose, вы можете добиться этого с помощью команды docker-compose.
docker-compose config --services
Не является прямым ответом на вопрос, поскольку он не использует yq, но, возможно, это помогает;)