I have several Docker Compose YAML files in a directory. I want to enforce that every declared volume uses the name `db-data`, and fail validation when any volume has a different source name, such as `cache-data:/data`. Is there a reliable way to do this with grep or a regular expression, or should I use a YAML-aware tool instead?
4 Answers
For a dependable check, parse the YAML and inspect each service's `volumes` list. A small Python script using PyYAML can iterate over `yaml.safe_load(...)["services"].values()`, then reject any volume that does not start with `db-data:`. This correctly handles indentation and avoids false matches in comments or unrelated fields. You can make the script exit with a nonzero status so a shell loop or CI job fails when an invalid volume is found.
Since these are YAML documents, use `yq` instead of trying to parse indentation and multi-line structure with grep. For example, this reports services containing a volume whose source does not start with `db-data:`: `yq -c '{container_name,badvols:[.volumes[] | select(test("^db-data:") | not)]} | select(.badvols | any)' file.yaml`. You can run it across the YAML files and treat any output as a validation failure.
If you only need a quick text-based check, first extract the volume entries and then compare them to the expected value. Tools such as `sed` or `awk` can track when the parser is inside a `volumes:` block and print entries whose source is not `db-data:`. However, this still makes assumptions about the YAML formatting, so `yq` or a Python YAML parser is the better long-term solution.
A regular expression can work for this narrow file format, but it is fragile because YAML structure can vary. GNU grep's `-Pzl` options can scan across lines and list files that do not contain the expected pattern, for example: `grep -Pzl 'db:n[^]*volumes:n(?!- db-data:)' docker-compose/*.yaml`. This is only safe if every file follows the same layout; it is not a general YAML parser.

That makes sense. The files are YAML, so matching the parsed structure sounds safer than depending on their exact formatting.