From 730fbfe9c584b40582fb21d2ddf0fbdcbf829a45 Mon Sep 17 00:00:00 2001 From: emile Date: Wed, 9 Sep 2015 16:49:51 +0200 Subject: [PATCH] docker override port, host, backend reuse loadbalancer --- docker.go | 46 ++++++++++++++++++++++++++++++++---- docker.tmpl | 29 +++++++---------------- templates/configuration.tmpl | 4 ++-- ramify.go => træfik.go | 40 ++++++++++++++++++------------- ramify.toml => træfik.toml | 2 +- 5 files changed, 76 insertions(+), 45 deletions(-) rename ramify.go => træfik.go (76%) rename ramify.toml => træfik.toml (96%) diff --git a/docker.go b/docker.go index 45a44b3e4..597f2605d 100644 --- a/docker.go +++ b/docker.go @@ -5,8 +5,31 @@ import ( "bytes" "github.com/BurntSushi/toml" "log" + "text/template" + "strings" ) - +var DockerFuncMap = template.FuncMap{ + "getBackend": func(container docker.Container) string { + for key, value := range container.Config.Labels { + if (key == "træfik.backend") { + return value + } + } + return container.Config.Hostname + }, + "getPort": func(container docker.Container) string { + for key, value := range container.Config.Labels { + if (key == "træfik.port") { + return value + } + } + for key, _ := range container.NetworkSettings.Ports { + return key.Port() + } + return "" + }, + "getHost": getHost, +} type DockerProvider struct { Watch bool Endpoint string @@ -38,16 +61,22 @@ func (provider *DockerProvider) loadDockerConfig() *Configuration { configuration := new(Configuration) containerList, _ := provider.dockerClient.ListContainers(docker.ListContainersOptions{}) containersInspected := []docker.Container{} + hosts := map[string][]docker.Container{} for _, container := range containerList { containerInspected, _ := provider.dockerClient.InspectContainer(container.ID) containersInspected = append(containersInspected, *containerInspected) + hosts[getHost(*containerInspected)] = append(hosts[getHost(*containerInspected)], *containerInspected) } - containers := struct { + + templateObjects := struct { Containers []docker.Container + Hosts map[string][]docker.Container }{ containersInspected, + hosts, } - tmpl, err := gtf.New("docker.tmpl").ParseFiles("docker.tmpl") + gtf.Inject(DockerFuncMap) + tmpl, err := template.New("docker.tmpl").Funcs(DockerFuncMap).ParseFiles("docker.tmpl") if err != nil { log.Println("Error reading file:", err) return nil @@ -55,7 +84,7 @@ func (provider *DockerProvider) loadDockerConfig() *Configuration { var buffer bytes.Buffer - err = tmpl.Execute(&buffer, containers) + err = tmpl.Execute(&buffer, templateObjects) if err != nil { log.Println("Error with docker template:", err) return nil @@ -66,4 +95,13 @@ func (provider *DockerProvider) loadDockerConfig() *Configuration { return nil } return configuration +} + +func getHost(container docker.Container) string { + for key, value := range container.Config.Labels { + if (key == "træfik.host") { + return value + } + } + return strings.TrimPrefix(container.Name, "/") } \ No newline at end of file diff --git a/docker.tmpl b/docker.tmpl index 69e8fae6f..c7aecccf4 100644 --- a/docker.tmpl +++ b/docker.tmpl @@ -1,25 +1,12 @@ [backends]{{range .Containers}} - [backends.backend-{{.Config.Hostname}}] - [backends.backend-{{.Config.Hostname}}.servers.server-{{.Config.Hostname}}] - - {{/* Only one exposed port! */}} - {{if eq (len .Config.ExposedPorts) 1}} - {{$ip := .NetworkSettings.IPAddress}} - {{range $keyPort, $valuePort := .Config.ExposedPorts}} - url = "http://{{$ip}}:{{$keyPort.Port}}" - {{end}} - {{else}} - - {{end}} + [backends.backend-{{getBackend .}}.servers.server-{{.Name | replace "/"}}] + url = "http://{{.NetworkSettings.IPAddress}}:{{getPort .}}" {{end}} -[routes]{{range .Containers}} - [routes.route-{{.Config.Hostname}}] - backends = ["backend-{{.Config.Hostname}}"] - [routes.route-{{.Config.Hostname}}.rules.rule-{{.Config.Hostname}}-hostname] +[routes]{{range $host, $containers := .Hosts}} + [routes.route-{{$host}}] + backends = [{{range $container := $containers}}"backend-{{getBackend $container}}",{{end}}] + [routes.route-{{$host}}.rules.rule-host-{{$host}}] category = "Host" - value = "{{.Config.Hostname}}.zenika.fr" - [routes.route-{{.Config.Hostname}}.rules.rule-{{.Config.Hostname}}-name] - category = "Host" - value = "{{.Name | replace "/"}}.zenika.fr" -{{end}} + value = "{{$host}}.zenika.fr" +{{end}} \ No newline at end of file diff --git a/templates/configuration.tmpl b/templates/configuration.tmpl index 7dc99a449..9bd54cd53 100644 --- a/templates/configuration.tmpl +++ b/templates/configuration.tmpl @@ -1,7 +1,7 @@ - Ramify + træfik @@ -18,7 +18,7 @@