问题描述
在使用docker-compose时,希望能够通过循环来优化定义多个服务的docker-compose.yml文件。他想知道是否有一种方法可以将多个服务定义压缩成一个块。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在纯Docker Compose中,没有直接的方法可以使用循环来定义多个服务。但是,如果你喜欢使用纯文本模板引擎(如Mustache、Jinja、m4等),你可以让它为你完成这个任务。
你将这个问题标记为shell-script,而Compose可以从标准输入中接收YAML配置,所以原则上你可以编写一个shell脚本,然后将其管道传递给docker-compose:
#!/bin/sh
buildComposeYaml() {
cat <<HEADER
version: '3'
services:
HEADER
for i in $(seq 3); do
cat <<BLOCK
s$i:
build: ../www$i
ports:
- "500$i:9000"
BLOCK
done
}
buildComposeYaml | docker-compose -f- "$@"
请注意,YAML对缩进非常敏感,而脚本中混合了脚本自身的缩进、嵌入在脚本中的YAML以及结束标记的缩进;所以这个脚本对于简单的工具来说是可以工作的,但不是我长期的选择。
方案2
使用docker-compose版本3.3扩展,并使用长格式的ports和volumes。
使用docker-compose版本3.3扩展,并使用长格式的ports和volumes:
version: '3.3'
services:
s1: &s
build: .
ports:
- published: 5001
target: 9000
volumes:
- source: ../www1
target: /var/www
s2:
<<: *s
ports:
- published: 5002
volumes:
- source: ../www2
s3:
<<: *s
ports:
- published: 5003
volumes:
- source: ../www3
这种方法并没有更加紧凑,但是它是原生的。Docker Compose版本3.4引入了进一步改进,使docker-compose.yml更加DRY。也许有更有经验的人会指出更大的改进!
正文完