如何用yq查询docker-compose.yml中使用指定卷的服务名
用yq从docker-compose.yml中找出使用指定卷的服务名称
需求
编写yq查询语句,从给定的docker-compose.yml文件中筛选出使用指定卷的服务名称。
示例场景
给定如下docker-compose.yml文件,需要找出使用卷v-app-olorin的服务名:
version: "3" services: arwen: this: that volumes: - v-app-mithrandir:/data/mithrandir - v-app-olorin:/data/olorin boromir: volumes: - v-app-mithrandir:/data/mithrandir - v-app-stormcrow:/data/stormcrow cirdan: volumes: - v-app-mithrandir:/data/mithrandir - v-app-olorin:/data/olorin volumes: v-app-mithrandir: name: v-app-mithrandir v-app-olorin: name: v-app-olorin v-app-stormcrow: name: v-app-stormcrow
预期输出结果:
arwen cirdan
已知可以通过简单键值匹配的yq语句筛选服务(如下),但无法处理volumes数组的匹配需求:
yq e '.services | with_entries(select(.value.this == "that")) | to_entries | .[] | .key' docker-compose.yml
解决方案
针对volumes数组的匹配需求,可利用yq的数组遍历和字符串匹配能力实现筛选:
基础匹配命令
yq e '.services | to_entries | .[] | select(.value.volumes[] | startswith("v-app-olorin:")) | .key' docker-compose.yml
命令解析
.services | to_entries:将services下的服务配置转换为包含key(服务名称)和value(服务详情)的条目数组.[]:遍历每个服务条目select(.value.volumes[] | startswith("v-app-olorin:")):筛选出volumes列表中存在以目标卷名加冒号开头条目的服务(适配docker-compose卷卷名:挂载路径的格式).key:输出符合条件的服务名称
精确匹配优化
若需严格匹配卷名(避免类似v-app-olorin-ext这类相似卷被误选),可使用以下两种方式:
方式1:正则匹配
yq e '.services | to_entries | .[] | select(.value.volumes[] | test("^v-app-olorin:")) | .key' docker-compose.yml
方式2:拆分卷字符串匹配
yq e '.services | to_entries | .[] | select(.value.volumes[] | split(":")[0] == "v-app-olorin") | .key' docker-compose.yml
内容的提问来源于stack exchange,提问作者grymoire
相关产品推荐
相关产品推荐

