Yq:检索对象键名称

Yq: retrieve object keys names

我有一个 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命令实现吗?

我尝试了这个但没有成功,灵感来自 this question:

$ cat docker-compose.yml | yq '.services.keys[]'
jq: error: Cannot iterate over null

keysjq 中的内置函数,当给定一个对象时,return 将它的键放入数组中。所以它实际上不是你的 yaml 的一部分(不是 属性),这意味着你不能做 services.keys.

要获取密钥,您可以在使用 Python yq 时执行以下操作:

我们将在第一部分中获取 services 的对象,然后将其传递给 keys,这将 return 基于给定对象的键列表

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 中的 Builtin operators and functions。请注意,yqjq 的包装器,因此 jq 的文档会有所帮助,因为 yq 的建议。


Go yq你可以做

yq e '.services | keys'

因为您只想列出 docker-compose 文件中的服务,您可以使用 docker-compose 命令实现。

docker-compose config --services

不是问题的直接答案,因为它没有使用 yq 但也许有帮助 ;)