├── README.md ├── demo.yml ├── myapp.yml ├── consul-server.yml ├── registrator.yml └── assembler.go /README.md: -------------------------------------------------------------------------------- 1 | 2 | ``` 3 | $ go run assembler.go demo.yml 4 | ``` 5 | -------------------------------------------------------------------------------- /demo.yml: -------------------------------------------------------------------------------- 1 | services: 2 | - consul-server 3 | - registrator 4 | - myapp 5 | config: 6 | hostip: 10.0.2.15 7 | debug: true 8 | foo: 9 | bar: baz 10 | -------------------------------------------------------------------------------- /myapp.yml: -------------------------------------------------------------------------------- 1 | image: myapp 2 | container_name: app 3 | dns: {{ $dns }} 4 | environment: 5 | - FOOBAR={{ $foo.bar }} 6 | {{ if .debug }} 7 | - DEBUG=true 8 | {{ end }} 9 | -------------------------------------------------------------------------------- /consul-server.yml: -------------------------------------------------------------------------------- 1 | image: gliderlabs/consul-server 2 | container_name: consul-server 3 | net: host 4 | command: -advertise {{ $hostip }} 5 | extra: 6 | dns: {{ $hostip }} 7 | -------------------------------------------------------------------------------- /registrator.yml: -------------------------------------------------------------------------------- 1 | image: gliderlabs/registrator:latest 2 | container_name: registrator 3 | net: host 4 | volumes: 5 | - /var/run/docker.sock:/tmp/docker.sock 6 | command: -ip={{ $hostip }} consul://{{ $hostip }}:8500 7 | -------------------------------------------------------------------------------- /assembler.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | "fmt" 6 | "io/ioutil" 7 | 8 | "gopkg.in/yaml.v2" 9 | "github.com/gliderlabs/sigil" 10 | _ "github.com/gliderlabs/sigil/builtin" 11 | ) 12 | 13 | var config = make(map[string]interface{}) 14 | var services = make(map[string]interface{}) 15 | 16 | func main() { 17 | 18 | data, err := ioutil.ReadFile(os.Args[1]) 19 | fatal(err) 20 | var obj map[string]interface{} 21 | fatal(yaml.Unmarshal(data, &obj)) 22 | if value, ok := obj["config"]; ok { 23 | exports := value.(map[interface{}]interface{}) 24 | for k,v := range exports { 25 | config[k.(string)] = v 26 | } 27 | } 28 | if value, ok := obj["services"]; ok { 29 | svcs := value.([]interface{}) 30 | for _, v := range svcs { 31 | load(v.(string)) 32 | } 33 | } 34 | yml, err := yaml.Marshal(services) 35 | fatal(err) 36 | fmt.Println(string(yml)) 37 | } 38 | 39 | func load(name string) { 40 | data, err := ioutil.ReadFile(name + ".yml") 41 | fatal(err) 42 | rendered, err := sigil.Execute(data, config, name) 43 | fatal(err) 44 | var service map[string]interface{} 45 | fatal(yaml.Unmarshal(rendered.Bytes(), &service)) 46 | if value, ok := service["extra"]; ok { 47 | exports := value.(map[interface{}]interface{}) 48 | for k,v := range exports { 49 | config[k.(string)] = v 50 | } 51 | delete(service, "extra") 52 | } 53 | services[name] = service 54 | } 55 | 56 | func fatal(err error) { 57 | if (err != nil) { 58 | panic(err) 59 | } 60 | } 61 | --------------------------------------------------------------------------------