无意间发现yaml提供了一个特别有意思的功能:锚点(&)和别名(*)。可以使用它们来引用 yaml 中一些重复的配置。
yaml 配置如下:
1
2
3
4
5
6
7
8
9
10
11
|
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
|
等同下面yaml配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
|
&
用来建立锚点(defaults),<<
表示合并到当前数据,*
用来引用锚点。
我将这一功能应用到docker-compose文件,省去了大量重复配置,使得 docker-compose 文件更为精炼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
x-templates:
agent_centos8_aarch64: &agent_centos8_aarch64
image: harbor.einscat.com:10011/library/centos8:aarch64
privileged: true
stdin_open: true
tty: true
extra_hosts:
- "docker-registry:192.168.18.20"
cap_add:
- ALL
working_dir: /opt
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw
services:
vm-1:
container_name: vm-1
hostname: "vm-1"
networks:
vm_net:
ipv4_address: 172.20.30.1
vm_net_2:
ipv4_address: 172.20.40.1
ports:
- "3306:3306"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
- "~/workspace:/root/workspace"
<<: *agent_centos8_aarch64
vm-2:
container_name: vm-2
hostname: "vm-2"
networks:
vm_net:
ipv4_address: 172.20.30.2
vm_net_2:
ipv4_address: 172.20.40.2
ports:
- "3307:3306"
- "6380:6379"
<<: *agent_centos8_aarch64
|
参考