Docker compose 文件中 << 是什么 | Yaml Merge key

前言

Yaml 文件在 Kubernetes 和 Docker compose 使用非常广泛,之前搞过 K8s 的运维同学还有称自己是 Yaml 工程师。不过肯定会有人不知道 Docker compose 文件中 << 是什么,还有 Yaml 的 merge key 概念大家是否了解,它有什么作用呢。

YAML merge key

Merge Key Language-Independent Type (<<) 是 YAML 中的一种数据类型,它允许将多个映射合并到一个映射中。这种类型提供了一种优雅和简洁的方式来组合和重用配置数据。 在 YAML 中,<<(称为 Merge Key) 一般和&* Yaml operators 搭配一起使用。首先 & 用于为复杂的数据结构创建一个锚点,* 则用于引用该锚点。

我们看下官方提供的例子:

yaml 复制代码
---
- &CENTER { x: 1, y: 2 }
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }

# All the following maps are equal:

- # Explicit keys
  x: 1
  y: 2
  r: 10
  label: center/big

- # Merge one map
  << : *CENTER
  r: 10
  label: center/big

- # Merge multiple maps
  << : [ *CENTER, *BIG ]
  label: center/big

- # Override
  << : [ *BIG, *LEFT, *SMALL ]
  x: 1
  label: center/big

<< Merge key 指定要与当前映射合并的一个或多个映射。它用于指示应将一个或多个指定映射的所有键插入到当前映射中。如果与键关联的值是单个映射节点,则其每个键/值对都将插入到当前映射中,除非该键已存在于其中。如果与 Merge key 关联的值是一个序列,则该序列应包含映射节点,并且每个节点都根据其在序列中的顺序依次合并。序列中较早映射节点中的键将覆盖后面映射节点中指定的键。

也可以使用 python 下面代码帮助理解

python 复制代码
import yaml
import pprint

y_str1 = '''
---
- &CENTER { x: 1, y: 2 }
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }

# All the following maps are equal:

- # Explicit keys
  x: 1
  y: 2
  r: 10
  label: center/big

- # Merge one map
  << : *CENTER
  r: 10
  label: center/big

- # Merge multiple maps
  << : [ *CENTER, *BIG ]
  label: center/big

- # Override
  << : [ *BIG, *LEFT, *SMALL ]
  x: 1
  label: center/big
         '''

pp = pprint.PrettyPrinter()
y1 = yaml.load(y_str1, Loader=yaml.SafeLoader)
pp.pprint(y1)

结果如下

txt 复制代码
[{'x': 1, 'y': 2},
 {'x': 0, 'y': 2},
 {'r': 10},
 {'r': 1},
 {'label': 'center/big', 'r': 10, 'x': 1, 'y': 2},
 {'label': 'center/big', 'r': 10, 'x': 1, 'y': 2},
 {'label': 'center/big', 'r': 10, 'x': 1, 'y': 2},
 {'label': 'center/big', 'r': 10, 'x': 1, 'y': 2}]

也就是说,合并时遵循的规则是:

  1. 如果遇到单个映射,则将该映射的键/值对插入,除非键已存在
  2. 如果遇到一个序列,则按序列顺序合并每个映射节点
  3. 序列中前面的映射节点具有更高优先级,会覆盖后面的同名键

docker-compose

有没发现,你之前编写的 docker compose 文件,services 里的每个容器的配置的某一部分可能会相同,这就可以使用 <<(Merge key)。使用 YAML Merge key << 可以减少 Docker Compose 文件长度,提高可读性。 实际上很多开源软件里的 docker compose 文件也有用到 Merge key,比如 redash,如下图

总结

Merge key <<语法让 YAML 能够组合和重用数据,使配置更加模块化和可维护。它消除了手动合并映射的需求,从而减少了重复代码。如果您在阅读过程中发现了任何问题,或者有任何可以改进的地方,欢迎留言或者私信我。

参考链接:

yaml.org/type/merge....

相关推荐
观测云2 小时前
Kubernetes CRD 方式配置容器日志采集最佳实践
容器·kubernetes·日志分析
i***22072 小时前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
羑悻的小杀马特5 小时前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
运维-大白同学8 小时前
2025最全面开源devops运维平台功能介绍
linux·运维·kubernetes·开源·运维开发·devops
EAIReport10 小时前
企业级报表自动化:基于Docker的部署实践
运维·docker·自动化
敲上瘾14 小时前
【探索实战】:Kurator分布式统一应用分发平台的全面解析与实践指南
分布式·容器·kubernetes·serverless
cui_win15 小时前
Docker Compose 部署一个完整的Prometheus监控告警系统
docker·容器·prometheus
ALex_zry19 小时前
Docker Compose运维技术实战分享:从安装到架构解析
运维·docker·架构
roman_日积跬步-终至千里1 天前
【Docker】Docker Stop 后到底发生了什么?——从信号机制到优雅停机
运维·docker·容器
z***6261 天前
Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像
docker·容器·tomcat