Skip to content

Commit f177402

Browse files
committed
Handle docker daemon restarts when watching events
1 parent 7c58c4a commit f177402

File tree

1 file changed

+110
-32
lines changed

1 file changed

+110
-32
lines changed

docker-gen.go

Lines changed: 110 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"errors"
45
"flag"
56
"fmt"
67
"log"
@@ -130,6 +131,21 @@ func usage() {
130131
println("Usage: docker-gen [-config file] [-watch=false] [-notify=\"restart xyz\"] [-notify-sighup=\"container-ID\"] [-interval=0] [-endpoint tcp|unix://..] [-tlscert file] [-tlskey file] [-tlscacert file] [-tlsverify] <template> [<dest>]")
131132
}
132133

134+
func NewDockerClient(endpoint string) (*docker.Client, error) {
135+
if strings.HasPrefix(endpoint, "unix:") {
136+
return docker.NewClient(endpoint)
137+
} else if tlsVerify || tlsCert != "" || tlsKey != "" || tlsCaCert != "" {
138+
if tlsVerify {
139+
if tlsCaCert == "" {
140+
return nil, errors.New("TLS verification was requested, but no -tlscacert was provided")
141+
}
142+
}
143+
144+
return docker.NewTLSClient(endpoint, tlsCert, tlsKey, tlsCaCert)
145+
}
146+
return docker.NewClient(endpoint)
147+
}
148+
133149
func generateFromContainers(client *docker.Client) {
134150
containers, err := getContainers(client)
135151
if err != nil {
@@ -156,7 +172,7 @@ func runNotifyCmd(config Config) {
156172
cmd := exec.Command("/bin/sh", "-c", config.NotifyCmd)
157173
out, err := cmd.CombinedOutput()
158174
if err != nil {
159-
log.Printf("error running notify command: %s, %s\n", config.NotifyCmd, err)
175+
log.Printf("Error running notify command: %s, %s\n", config.NotifyCmd, err)
160176
log.Print(string(out))
161177
}
162178
}
@@ -205,7 +221,7 @@ func generateAtInterval(client *docker.Client, configs ConfigFile) {
205221
case <-ticker.C:
206222
containers, err := getContainers(client)
207223
if err != nil {
208-
log.Printf("error listing containers: %s\n", err)
224+
log.Printf("Error listing containers: %s\n", err)
209225
continue
210226
}
211227
// ignore changed return value. always run notify command
@@ -229,28 +245,103 @@ func generateFromEvents(client *docker.Client, configs ConfigFile) {
229245

230246
wg.Add(1)
231247
defer wg.Done()
248+
/*
249+
err := client.AddEventListener((chan<- *docker.APIEvents)(eventChan))
250+
if err != nil {
251+
log.Fatalf("Unable to add docker event listener: %s", err)
252+
}
253+
defer client.RemoveEventListener(eventChan)*/
232254

233-
eventChan := make(chan *docker.APIEvents, 100)
234-
defer close(eventChan)
235-
236-
err := client.AddEventListener((chan<- *docker.APIEvents)(eventChan))
237-
if err != nil {
238-
log.Fatalf("Unable to add docker event listener: %s", err)
239-
}
240-
defer client.RemoveEventListener(eventChan)
241-
242-
log.Println("Watching docker events")
243255
for {
244-
event := <-eventChan
256+
if client == nil {
257+
var err error
258+
endpoint, err := getEndpoint()
259+
if err != nil {
260+
log.Printf("Bad endpoint: %s", err)
261+
time.Sleep(10 * time.Second)
262+
continue
263+
}
245264

246-
if event == nil {
247-
continue
265+
client, err = NewDockerClient(endpoint)
266+
if err != nil {
267+
log.Printf("Unable to connect to docker daemaon: %s", err)
268+
time.Sleep(10 * time.Second)
269+
continue
270+
}
271+
generateFromContainers(client)
248272
}
249273

250-
if event.Status == "start" || event.Status == "stop" || event.Status == "die" {
251-
log.Printf("Received event %s for container %s", event.Status, event.ID[:12])
252-
generateFromContainers(client)
274+
eventChan := make(chan *docker.APIEvents, 100)
275+
defer close(eventChan)
276+
277+
watching := false
278+
for {
279+
280+
if client == nil {
281+
break
282+
}
283+
err := client.Ping()
284+
if err != nil {
285+
log.Printf("Unable to ping docker daemaon: %s", err)
286+
if watching {
287+
client.RemoveEventListener(eventChan)
288+
watching = false
289+
client = nil
290+
}
291+
time.Sleep(10 * time.Second)
292+
break
293+
294+
}
295+
296+
if !watching {
297+
err = client.AddEventListener(eventChan)
298+
if err != nil && err != docker.ErrListenerAlreadyExists {
299+
log.Printf("Error registering docker event listener: %s", err)
300+
time.Sleep(10 * time.Second)
301+
continue
302+
}
303+
watching = true
304+
log.Println("Watching docker events")
305+
}
306+
307+
select {
308+
309+
case event := <-eventChan:
310+
if event == nil {
311+
if watching {
312+
client.RemoveEventListener(eventChan)
313+
watching = false
314+
client = nil
315+
}
316+
break
317+
}
318+
319+
if event.Status == "start" || event.Status == "stop" || event.Status == "die" {
320+
log.Printf("Received event %s for container %s", event.Status, event.ID[:12])
321+
generateFromContainers(client)
322+
}
323+
case <-time.After(10 * time.Second):
324+
// check for docker liveness
325+
}
326+
253327
}
328+
329+
/* event := <-eventChan
330+
println(event)
331+
if event == nil {
332+
client.RemoveEventListener(eventChan)
333+
client, err = NewDockerClient(endpoint)
334+
println(client)
335+
if err != nil {
336+
log.Printf("Error connecting to docker daemon: %s", err)
337+
}
338+
goto RESTART
339+
}
340+
341+
if event.Status == "start" || event.Status == "stop" || event.Status == "die" {
342+
log.Printf("Received event %s for container %s", event.Status, event.ID[:12])
343+
generateFromContainers(client)
344+
}*/
254345
}
255346
}
256347

@@ -312,20 +403,7 @@ func main() {
312403
log.Fatalf("Bad endpoint: %s", err)
313404
}
314405

315-
var client *docker.Client
316-
if strings.HasPrefix(endpoint, "unix:") {
317-
client, err = docker.NewClient(endpoint)
318-
} else if tlsVerify || tlsCert != "" || tlsKey != "" || tlsCaCert != "" {
319-
if tlsVerify {
320-
if tlsCaCert == "" {
321-
log.Fatal("TLS verification was requested, but no -tlscacert was provided")
322-
}
323-
}
324-
325-
client, err = docker.NewTLSClient(endpoint, tlsCert, tlsKey, tlsCaCert)
326-
} else {
327-
client, err = docker.NewClient(endpoint)
328-
}
406+
client, err := NewDockerClient(endpoint)
329407
if err != nil {
330408
log.Fatalf("Unable to create docker client: %s", err)
331409
}

0 commit comments

Comments
 (0)