I have a yaml file, inside which I use anchors & aliases to DRY up the file. It's a docker-compose file. Simple e.g. follows:
version: "3.4"
x-build: &build
context: ../
services:
api:
build:
<<: *build
dockerfile: some-path/Dockerfile
image: gcr.io/some-project/api
I use yq and then jq to convert this to json and pass it to terraform so that I can re-use the information in docker-compose as a source of truth.
All the aliases and anchors get removed from the resulting json. Not a disaster, but it would be much nicer to have it actually expanded.
I'm looking for a command-line tool that I can run in a bash script to take the above json as an input and expand the anchors and aliases, and write the result to stdout, so something like:
version: "3.4"
services:
api:
build:
context: ../
dockerfile: some-path/Dockerfile
image: gcr.io/some-project/api
Does anyone know how to do this?
Why aren't you taking the yaml as source of truth?
You should have a look on spruce. Basically it is a yaml/json merge tool that can also convert to json. However, it also throws your anchors and aliases away.
Convert yml to json, thus no need for yq and jq action anymore :)
spruce json
Merge yml files:
spruce merge file1.yml file2.yml
Your example:
$ spruce merge spruce-input.yml
services:
api:
build:
context: ../
dockerfile: some-path/Dockerfile
image: gcr.io/some-project/api
version: "3.4"
x-build:
context: ../
$ spruce json spruce-input.yml | jq -r
{
"services": {
"api": {
"build": {
"context": "../",
"dockerfile": "some-path/Dockerfile"
},
"image": "gcr.io/some-project/api"
}
},
"version": "3.4",
"x-build": {
"context": "../"
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With