如何扩展 YAML 锚点和别名并在 Bash 中获取生成的 YAML?

Seb*_*eth 5 bash yaml

我有一个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)

有谁知道如何做到这一点?

mue*_*hsi 3

为什么不将 yaml 作为事实来源?你应该看看云杉。基本上它是一个yaml/json合并工具,也可以转换为json. 然而,它也会丢掉你的锚点和别名。

转换yml为 json,因此不再需要yqjq操作:)

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)