我有一个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
答案 0 :(得分:3)
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
中检查Builtin operators and functions。请注意,yq
是jq
的包装,因此jq
的文档将在yq
的帮助下提供帮助。
答案 1 :(得分:1)
由于您只想从docker-compose文件中列出服务,因此可以使用docker-compose命令来实现。
docker-compose config --services
不是直接回答问题,因为它没有使用yq,但也许有帮助;)