我有一个 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
Run Code Online (Sandbox Code Playgroud)
我想提取服务名称感谢yq,相当于jq但对于 YAML,有这个输出:
"apache"
"mysql"
"php"
Run Code Online (Sandbox Code Playgroud)
目前我可以这样实现:
$ cat docker-compose.yml | yq '.services' | yq 'keys[]'
"apache"
"mysql"
"php"
Run Code Online (Sandbox Code Playgroud)
即使它有效,双管道yq对我来说也很奇怪。我想我做错了。
问题:有什么办法可以用一个yq命令来实现它吗?
我试过这个没有成功,从这个问题中获得灵感:
$ cat docker-compose.yml | yq '.services.keys[]'
jq: error: Cannot iterate over null
Run Code Online (Sandbox Code Playgroud)
keys是一个内置函数,jq当给定一个对象时,在数组中返回它的键。所以它实际上并不是你的 yaml(不是属性)的一部分,这意味着你不能做services.keys.
要获取密钥,您可以执行以下操作:
我们将获得services第一部分中的对象,然后将其传递给keys它将基于给定对象返回键列表
cat docker-compose.yml | yq '.services | keys'
Run Code Online (Sandbox Code Playgroud)
或者像这样(没有 cat 和 pipe):
yq '.services | keys' docker-compose.yml
Run Code Online (Sandbox Code Playgroud)
输出将是:
[
"apache",
"mysql",
"php"
]
Run Code Online (Sandbox Code Playgroud)
要摆脱括号:
yq '.services | keys[]' docker-compose.yml
Run Code Online (Sandbox Code Playgroud)
输出:
"apache"
"mysql"
"php"
Run Code Online (Sandbox Code Playgroud)
欲了解更多有关信息,您可以检查内建运算符和函数在jq。请注意,这yq是一个包装器,jq因此文档jq将作为yq建议的帮助有所帮助。
由于您只想列出 docker-compose 文件中的服务,因此可以使用 docker-compose 命令来实现此目的。
docker-compose config --services
Run Code Online (Sandbox Code Playgroud)
不是问题的直接答案,因为它没有使用 yq 但也许有帮助;)