我有一个yaml
文件,在其中使用锚点和别名来干燥该文件。这是一个docker-compose
文件。简单例如如下:
version: "3.4"
x-build: &build
context: ../
services:
api:
build:
<<: *build
dockerfile: some-path/Dockerfile
image: gcr.io/some-project/api
我先使用yq
,然后使用jq
将其转换为json
并将其传递给terraform
,以便我可以重用docker-compose
中的信息作为真理的来源。
所有别名和锚点均从结果json
中删除。这不是灾难,但实际上扩展它会更好。
我正在寻找可以在bash
脚本中运行的命令行工具,以将上面的json
作为输入,并扩展锚点和别名,并将结果写入stdout ,例如:
version: "3.4"
services:
api:
build:
context: ../
dockerfile: some-path/Dockerfile
image: gcr.io/some-project/api
有人知道该怎么做吗?
答案 0 :(得分:0)
您为什么不把Yaml当作真理的来源?
您应该看看spruce。基本上,它是一个yaml
/ json
合并工具,也可以转换为json
。但是,它也会丢弃您的锚点和别名。
将yml
转换为json,这样就不再需要yq
和jq
了:)
spruce json
合并yml
个文件:
spruce merge file1.yml file2.yml
您的示例:
$ 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": "../"
}
}