我有一个名为 original.yml
的 yaml 文件,其内容如下:
version: '2'
services:
vendor-app:
image: vendor/vendor-app@sha256:f9db328fe5eed87f89cc0390a91c65eb92351fedda8a0c833b30c9147bd7ba07
logging:
driver: json-file
options:
max-size: "50m"
max-file: "2"
volumes:
- /my_vol
labels:
io.rancher.container.pull_image: always
com.vendor-app.builder.version: "3bc55d00c"
com.vendor-app.built: "Mon, 01 Jan 2021 19:32:24 -0000"
myservice:
image: myregistry/myservice
logging:
driver: json-file
options:
max-size: "50m"
max-file: "2"
volumes:
- /my_vol2
labels:
io.rancher.container.pull_image: always
我有另一个 yaml 文件,我将它称为 vendor.yml
,我会定期从供应商那里获得,内容如下:
version: '2'
services:
vendor-app:
image: vendor/vendor-app@sha256:ba065e9a04478fc17fd5b61b8c558616b7e9acba105668ef786f084545c32778
logging:
driver: json-file
options:
max-size: "50m"
max-file: "20"
volumes:
- /my_vol
labels:
com.vendor-app.builder.version: "7766jjc"
com.vendor-app.built: "Fri, 14 Dec 2018 20:50:35 -0000"
我想将 image
中的 original.yml
中的 image
替换为 vendor.yml
中的 labels
,并将 vendor.yml
中的 labels
与现有的 {{ original.yml
中的 1}}。基本上最终结果应该如下:
services:
vendor-app:
image: vendor/vendor-app@sha256:ba065e9a04478fc17fd5b61b8c558616b7e9acba105668ef786f084545c32778
logging:
driver: json-file
options:
max-size: "50m"
max-file: "2"
volumes:
- /my_vol
labels:
io.rancher.container.pull_image: always
com.vendor-app.builder.version: "7766jjc"
com.vendor-app.built: "Fri, 14 Dec 2018 20:50:35 -0000"
myservice:
image: myregistry/myservice
logging:
driver: json-file
options:
max-size: "50m"
max-file: "2"
volumes:
- /my_vol2
labels:
io.rancher.container.pull_image: always
通过这样做,我几乎达到了我的目标:
Map merge(Map... maps) {
Map result = [:]
maps.each { map ->
map.each { k, v ->
result[k] = result[k] instanceof Map ? merge(result[k], v) : v
}
}
result
}
def latest_yml = readYaml file:"vendor.yml"
def current_yml = readYaml file:"original.yml"
def new_yml = readYaml file:"original.yml"
current_yml.services['vendor-app'].image = latest_yml.services['vendor'].image
current_yml.services['vendor-app'].labels = latest_yml.services['vendor-app'].labels
writeYaml file:"beforemerge.yml", data: current_yml
println "merge(new_yml, current_yml): " + merge(new_yml, current_yml)
writeYaml file:"aftermerge.yml", data: merge(new_yml, current_yml)
几乎,因为这就是我在aftermerge.yml
中得到的:
services:
vendor-app:
image: vendor/vendor-app@sha256:ba065e9a04478fc17fd5b61b8c558616b7e9acba105668ef786f084545c32778
logging:
driver: json-file
options:
max-size: 50m
max-file: '2'
volumes:
- /my_vol
labels:
io.rancher.container.pull_image: always
com.vendor-app.builder.version: 7766jjc
com.vendor-app.built: Fri, 14 Dec 2018 20:50:35 -0000
myservice:
image: myregistry/myservice
logging:
driver: json-file
options:
max-size: 50m
max-file: '2'
volumes:
- /my_vol2
labels:
io.rancher.container.pull_image: always
正如你所看到的,它有点弄乱了格式...... com.vendor-app.built
和 com.vendor-app.builder.version
的双引号已经消失了,这显然会在我使用更新的 yaml 文件时造成严重破坏(此处的示例是 docker-compose.yml 的修订版本)。 max-size
和 max-file
周围的引号也更改为仅用于 max-file
的单引号 ??奇怪...
为什么要这样做,我如何使逻辑保留引用?
有没有更好的方法来做到这一点?我真正想要做的就是从 image
和 labels
中获取值,并使用它们来更新 vendor.yml
中的相同值(在 {{1 }},附加到 original.yml
中的当前值以及更新)。
任何帮助将不胜感激,谢谢。