【通用常识】YAML 中的高阶语法

说明:YAML 中用于锚点(Anchor)、合并(Merge) 和引用(Reference) 的特殊语法。主要用来做配置参数服用和组装

在java中可以直接映射过来用

java 复制代码
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private String name;
    private String version;
    // getters and setters
}

应用代码

yaml 复制代码
# 定义锚点
base_config: &defaults
  environment: production
  timeout: 30s
  retries: 3

# 第一次引用 defaults
service_a:
  <<: *defaults
  host: service-a.example.com

# 第二次引用 defaults
service_b:
  <<: *defaults
  host: service-b.example.com
  timeout: 60s  # 覆盖默认值

# 第三次引用 defaults(完全独立的位置)
monitoring:
  <<: *defaults
  purpose: health-check
  interval: 10s

解析结果

yaml 复制代码
service_a:
  environment: production
  timeout: 30s
  retries: 3
  host: service-a.example.com

service_b:
  environment: production
  timeout: 60s
  retries: 3
  host: service-b.example.com

monitoring:
  environment: production
  timeout: 30s
  retries: 3
  purpose: health-check
  interval: 10s

共享通用配置(环境变量、网络、卷等) docker-compose.yaml

yaml 复制代码
version: '3.8'

x-common-env: &common-env
  environment:
    NODE_ENV: production
    TZ: Asia/Shanghai
    LOG_LEVEL: info

x-common-config: &common-config
  restart: unless-stopped
  networks:
    - app-network
  volumes:
    - ./logs:/app/logs
  logging:
    driver: "json-file"
    options:
      max-size: "10m"
      max-file: "3"

services:
  web:
    image: nginx:alpine
    <<: *common-config
    environment:
      <<: *common-env
      PORT: 80
    ports:
      - "80:80"

  api:
    image: my-api:latest
    <<: *common-config
    environment:
      <<: *common-env
      DATABASE_URL: postgres://db:5432/myapp
    ports:
      - "3000:3000"

  worker:
    image: my-worker:latest
    <<: *common-config
    environment:
      <<: *common-env
      QUEUE_NAME: tasks
    depends_on:
      - redis

networks:
  app-network:
    driver: bridge

共享环境变量(支持合并)

yaml 复制代码
x-env-base: &env-base
  DATABASE_HOST: db
  REDIS_URL: redis://redis:6379

x-env-prod: &env-prod
  <<: *env-base
  NODE_ENV: production
  API_KEY: ${PROD_API_KEY}

x-env-dev: &env-dev
  <<: *env-base
  NODE_ENV: development
  DEBUG: true

services:
  api-prod:
    image: myapp:latest
    environment: *env-prod

  api-dev:
    image: myapp:latest
    environment: *env-dev

共享卷挂载或部署配置(Swarm 模式)

yaml 复制代码
x-volumes: &app-volumes
  volumes:
    - static-data:/var/www/html
    - logs:/var/log/app

x-deploy: &common-deploy
  deploy:
    replicas: 3
    update_config:
      parallelism: 2
      delay: 10s
    restart_policy:
      condition: on-failure

services:
  frontend:
    image: nginx
    <<: *app-volumes
    <<: *common-deploy
    ports:
      - "80:80"

  backend:
    image: app:latest
    <<: *app-volumes
    <<: *common-deploy
    environment:
      - ENV=prod

使用 x- 前缀定义自定义锚点(官方推荐)

  1. Docker Compose 支持以 x- 开头的自定义字段,这些字段不会被解析为服务,仅用于组织配置。
yaml 复制代码
x-defaults: &defaults
  restart: unless-stopped
  logging:
    driver: json-file
    options:
      max-size: "10m"

x-monitoring: &monitoring
  environment:
    MONITORING: "true"
    AGENT_HOST: host.docker.internal

services:
  web:
    image: nginx
    <<: *defaults
    <<: *monitoring
    ports:
      - "80:80"

使用误区

❌ 错误:在列表中使用 <<

yaml 复制代码
# 错误!ports 是列表,不能用 <<
ports:
  <<: *some-map   # ❌ 无效
  - "80:80"

❌ 错误:引用未定义的锚点

yaml 复制代码
# 错误!ports 是列表,不能用 <<
ports:
  <<: *some-map   # ❌ 无效
  - "80:80"

❌ 错误:先引用后定义

yaml 复制代码
service:
  environment: *env
  # ... 其他内容
env: &env    # 锚点定义在后面 ❌ 某些解析器不支持
  KEY: value

理想结构

yaml 复制代码
# docker-compose.yml
x-env: &env
  environment:
    TZ: Asia/Shanghai

x-base: &base
  restart: unless-stopped
  networks:
    - app

x-app: &app
  <<: *base
  <<: *env
  volumes:
    - logs:/var/log

services:
  web: <<: *app
  api: <<: *app
  worker: <<: *app

networks:
  app: driver: bridge
volumes:
  logs:
相关推荐
张3233 小时前
K8s控制器学习难点
云原生·容器·kubernetes
qwy7152292581635 小时前
1-Docker Engine 安装前置环境配置
运维·docker·容器
菜菜艾7 小时前
基于llama.cpp部署私有大模型
linux·运维·服务器·人工智能·ai·云计算·ai编程
重生的黑客7 小时前
Linux开发工具:条件编译、动静态库与 make/makefile 入门
linux·运维·服务器
minji...7 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
.柒宇.7 小时前
nginx入门教程
运维·nginx
航Hang*8 小时前
VMware vSphere 云平台运维与管理基础——第2章(扩展):VMware ESXi 5.5 安装、配置与运维
运维·服务器·github·系统安全·虚拟化
SPC的存折8 小时前
MySQL 8组复制完全指南
linux·运维·服务器·数据库·mysql
运维行者_8 小时前
OpManager MSP NetFlow Analyzer集成解决方案,应对多客户端网络流量监控挑战
大数据·运维·服务器·网络·数据库·自动化·运维开发
sszdzq8 小时前
docker 安装 doris
运维·docker·容器