我有一个yaml文件,在其中我使用锚点和别名来干燥文件。这是一个docker-compose文件。简单例如如下:
version: "3.4"
x-build: &build
context: ../
services:
api:
build:
<<: *build
dockerfile: some-path/Dockerfile
image: gcr.io/some-project/api
Run Code Online (Sandbox Code Playgroud)
我使用yq然后jq将其转换为json并将其传递给,terraform以便我可以重新使用该信息docker-compose作为事实来源。
所有别名和锚点都会从结果中删除json。不是灾难,但如果能真正扩展它会更好。
我正在寻找一个可以在bash脚本中运行的命令行工具,以将上述内容json作为输入并展开锚点和别名,并将结果写入标准输出,例如:
version: "3.4"
services:
api:
build:
context: ../
dockerfile: some-path/Dockerfile
image: gcr.io/some-project/api
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
为什么不将 yaml 作为事实来源?你应该看看云杉。基本上它是一个yaml/json合并工具,也可以转换为json. 然而,它也会丢掉你的锚点和别名。
转换yml为 json,因此不再需要yq和jq操作:)
spruce json
Run Code Online (Sandbox Code Playgroud)
合并yml文件:
spruce merge file1.yml file2.yml
Run Code Online (Sandbox Code Playgroud)
你的例子:
$ 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": "../"
}
}
Run Code Online (Sandbox Code Playgroud)