brettmc / docker-compose-generator

基于模板的 docker-compose 文件生成

0.15 2021-07-12 06:45 UTC

README

Build Status Coverage Status

一个从一个或多个模板中填充 docker-compose 文件的工具,使用类似 mustache 的替换。

安装/使用

Composer 包

composer require brettmc/docker-compose-generator

Docker 镜像

docker run --rm -it brettmc/docker-compose-generator --help

概述

如果您需要维护多个略有不同、按环境变化的 docker-compose 配置,您就来到了正确的位置。

这个工具在我日常工作中的一些中型项目中用于生产环境,通常使用方法如下

  • git 提交触发 CI/CD 流水线
  • 流水线测试、构建并标记一些 Docker 镜像,准备部署
  • 流水线执行一个 shell 脚本,测试一些变量以确定部署到哪个环境,以及应该包含哪些文件
    • 标记 -> 生产环境
    • 开发 -> 测试环境
    • 其他所有内容 -> 构建环境
  • 通过组合主模板文件和一个或多个环境特定文件以及可选的主和环境特定 .ini 文件来生成 docker-compose 配置,并通过 -e 开关最终使用任何动态值
  • 将生成的文件传递给 docker stack deploy

按环境差异

例如,对开发分支的提交会在 dev 集群中构建和部署。每个开发部署都有自己的数据库,但测试和生产部署则不是。

多个输入文件

合并多个 yaml 模板。例如,一个 main.yml 模板可以通过 dev.yml 添加额外服务来扩展。这些将在后续操作应用之前合并在一起。如果从 stdin 和通过 --input 选项提供模板,则先处理 stdin。通过 --input 提供的多个输入按顺序处理。

变量替换

合并所有模板后,根据 .ini 文件中的值对结果执行变量替换,然后是环境变量,最后是来自 -e 标志的变量。

以多种方式定义变量

以下顺序接受来自 INI 风格环境文件或命令开关的变量

  • .ini 文件(例如 --ini global.ini --ini local.ini)按提供的顺序处理,重复键将覆盖先前的键;然后
  • 环境变量;然后
  • 命令行变量(-e FOO=foo);最后
  • 可空命令行变量(-o FOO=-o FOO=foo) - 如果给出了空值,则忽略它,并且不会覆盖先前的设置

用法

main.yml

version: '3.4'
networks:
  front:
  back:
services:
  my-service:
    image: "my-service:{{TAG_OR_HASH}}"
    environment:
      BAR: "{{BAR}}"

dev.yml

services:
  my-service:
    ports:
      - "80:80"
  db:
    image: "postgres"

prod.yml

services:
  my-service:
    image: "my-service:{{TAG_OR_HASH}}"

prod.ini

DB_HOST=prod.db.example.com
AUTH=prod.signon.example.com

dev.ini

AUTH=dev.signon.example.com

然后您可以根据需要编写自己的逻辑来确定在 main.yml 之后应用哪些文件,例如

#!/bin/bash
echo "generating for env: ${CI_ENV} #pre-defined variable, eg from a cicd system
case ${CI_ENV} in
  BUILD)
    HOST=docker-build-swarm-manager.example.com
    STACK=${CI_COMMIT_HASH}
    TAG_OR_HASH=${CI_COMMIT_HASH}
    BAR=something
    ;;
  PROD)
    HOST=docker-prod-swarm-manager.example.com
    STACK=prod
    TAG_OR_HASH=${CI_COMMIT_TAG}
    BAR=something-else
    ;;
esac
bin/dcgen.php generate -e HASH=${CI_COMMIT_HASH} -e BAR=${BAR} --ini ${CI_ENV}.ini --input main.yml --input ${CI_ENV}.yml > docker-compose.yml
docker -H ${HOST} stack deploy --prune --with-registry-auth -c docker-compose.yml ${STACK}

通过 Docker 运行

注意:如果您正在管道输入,则不要附加 TTY(即,不要使用 Docker 的 -t 开关)

$ docker run --rm -i brettmc/docker-compose-generator generate -e FOO=foo -e BAR=bar < main.yml > output.yml

$ cat main.yml | docker run --rm -i brettmc/docker-compose-generator generate -e FOO=foo -e BAR=bar > output.yml

或仅使用卷

$ docker run --rm -v $(pwd)/conf:/srv/conf -v $(pwd)/template:/srv/template brettmc/docker-compose-generator generate --input /srv/template/main.yml --input /srv/template/dev.yml --ini /srv/conf/dev.ini -e DB_HOST=${HOST} > output.yml