使用docker-compose循环定义多个服务

125次阅读
没有评论

问题描述

在使用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。也许有更有经验的人会指出更大的改进!

正文完