diff --git a/README.md b/README.md index df6dcf7a..9a4dd475 100644 --- a/README.md +++ b/README.md @@ -289,7 +289,12 @@ type SwarmNode struct { } type State struct { - Running bool + Running bool + Health Health +} + +type Health struct { + Status string } // Accessible from the root in templates as .Docker diff --git a/internal/context/context.go b/internal/context/context.go index 30b6faa6..0c12db87 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -82,6 +82,11 @@ type Volume struct { type State struct { Running bool + Health Health +} + +type Health struct { + Status string } type RuntimeContainer struct { diff --git a/internal/generator/generator.go b/internal/generator/generator.go index 63231ce2..b41c0c59 100644 --- a/internal/generator/generator.go +++ b/internal/generator/generator.go @@ -278,7 +278,7 @@ func (g *generator) generateFromEvents() { time.Sleep(10 * time.Second) break } - if event.Status == "start" || event.Status == "stop" || event.Status == "die" { + if event.Status == "start" || event.Status == "stop" || event.Status == "die" || strings.Index(event.Status, "health_status:") != -1 { log.Printf("Received event %s for container %s", event.Status, event.ID[:12]) // fanout event to all watchers for _, watcher := range watchers { @@ -401,6 +401,9 @@ func (g *generator) getContainers() ([]*context.RuntimeContainer, error) { }, State: context.State{ Running: container.State.Running, + Health: context.Health{ + Status: container.State.Health.Status, + }, }, Name: strings.TrimLeft(container.Name, "/"), Hostname: container.Config.Hostname, diff --git a/internal/generator/generator_test.go b/internal/generator/generator_test.go index 4675f251..41d8b65b 100644 --- a/internal/generator/generator_test.go +++ b/internal/generator/generator_test.go @@ -88,6 +88,11 @@ func TestGenerateFromEvents(t *testing.T) { Pid: 400, ExitCode: 0, StartedAt: time.Now(), + Health: docker.Health{ + Status: "healthy", + FailingStreak: 5, + Log: []docker.HealthCheck{}, + }, }, Image: "0ff407d5a7d9ed36acdf3e75de8cc127afecc9af234d05486be2981cdc01a38d", NetworkSettings: &docker.NetworkSettings{ diff --git a/templates/nginx.tmpl b/templates/nginx.tmpl index 58f6c77e..25dc0bc5 100644 --- a/templates/nginx.tmpl +++ b/templates/nginx.tmpl @@ -19,6 +19,12 @@ upstream {{ $host }} { {{ $addrLen := len $value.Addresses }} {{ $network := index $value.Networks 0 }} + {{ if $value.State.Health.Status }} + {{ if ne $value.State.Health.Status "healthy" }} + {{ continue }} + {{ end }} + {{ end }} + {{/* If only 1 port exposed, use that */}} {{ if eq $addrLen 1 }} {{ with $address := index $value.Addresses 0 }}