Yq: получить имена ключей объектов - PullRequest
1 голос
/ 21 марта 2019

У меня есть файл 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

Ответы [ 2 ]

3 голосов
/ 21 марта 2019

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.

1 голос
/ 23 июля 2019

Поскольку вы просто хотите перечислить сервисы из файла docker-compose, вы можете добиться этого с помощью команды docker-compose.

docker-compose config --services

Не является прямым ответом на вопрос, поскольку он не использует yqно возможно это поможет;)

...