You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

命令解析

  1. .services | to_entries:将services下的服务配置转换为包含key(服务名称)和value(服务详情)的条目数组
  2. .[]:遍历每个服务条目
  3. select(.value.volumes[] | startswith("v-app-olorin:")):筛选出volumes列表中存在以目标卷名加冒号开头条目的服务(适配docker-compose卷卷名:挂载路径的格式)
  4. .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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:45:42