Skip to content

Commit 4140e3f

Browse files
committed
Added flag -notify-sighup for sending HUP signal to containers.
1 parent 2847e7b commit 4140e3f

File tree

2 files changed

+54
-27
lines changed

2 files changed

+54
-27
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ $ docker-gen
4040
Usage: docker-gen [options] <template> [<dest>]
4141
```
4242

43-
[-config file] [-watch=false] [-notify="restart xyz"] [-interval=0] [-endpoint tcp|unix://..]
43+
[-config file] [-watch=false] [-notify="restart xyz"] [-notify-sighup="nginx-proxy"] [-interval=0] [-endpoint tcp|unix://..]
4444

4545
*Options:*
4646
```
@@ -50,6 +50,7 @@ Usage: docker-gen [options] <template> [<dest>]
5050
-interval=0:run notify command interval (s). Useful for service registration use cases.
5151
-notify="": run command after template is regenerated ["restart xyz"]. Useful for restarting nginx,
5252
reloading haproxy, etc..
53+
-notify-sighup="": send HUP signal to container. Equivalent to `docker kill -s HUP container-ID`
5354
-only-exposed=false: only include containers with exposed ports
5455
-only-published=false: only include containers with published ports (implies -only-exposed)
5556
-version=false: show version

docker-gen.go

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,18 @@ import (
1515
)
1616

1717
var (
18-
buildVersion string
19-
version bool
20-
watch bool
21-
notifyCmd string
22-
onlyExposed bool
23-
onlyPublished bool
24-
configFile string
25-
configs ConfigFile
26-
interval int
27-
endpoint string
28-
wg sync.WaitGroup
18+
buildVersion string
19+
version bool
20+
watch bool
21+
notifyCmd string
22+
notifySigHUPContainerID string
23+
onlyExposed bool
24+
onlyPublished bool
25+
configFile string
26+
configs ConfigFile
27+
interval int
28+
endpoint string
29+
wg sync.WaitGroup
2930
)
3031

3132
type Event struct {
@@ -66,13 +67,14 @@ func (i *DockerImage) String() string {
6667
}
6768

6869
type Config struct {
69-
Template string
70-
Dest string
71-
Watch bool
72-
NotifyCmd string
73-
OnlyExposed bool
74-
OnlyPublished bool
75-
Interval int
70+
Template string
71+
Dest string
72+
Watch bool
73+
NotifyCmd string
74+
NotifyContainers []docker.KillContainerOptions
75+
OnlyExposed bool
76+
OnlyPublished bool
77+
Interval int
7678
}
7779

7880
type ConfigFile struct {
@@ -120,7 +122,7 @@ func (r *RuntimeContainer) PublishedAddresses() []Address {
120122
}
121123

122124
func usage() {
123-
println("Usage: docker-gen [-config file] [-watch=false] [-notify=\"restart xyz\"] [-interval=0] [-endpoint tcp|unix://..] <template> [<dest>]")
125+
println("Usage: docker-gen [-config file] [-watch=false] [-notify=\"restart xyz\"] [-notify-sighup=\"container-ID\"] [-interval=0] [-endpoint tcp|unix://..] <template> [<dest>]")
124126
}
125127

126128
func generateFromContainers(client *docker.Client) {
@@ -136,6 +138,7 @@ func generateFromContainers(client *docker.Client) {
136138
continue
137139
}
138140
runNotifyCmd(config)
141+
sendSignalToContainer(client, config)
139142
}
140143
}
141144

@@ -154,6 +157,20 @@ func runNotifyCmd(config Config) {
154157
}
155158
}
156159

160+
func sendSignalToContainer(client *docker.Client, config Config) {
161+
if len(config.NotifyContainers) < 1 {
162+
return
163+
}
164+
165+
for _, killOpts := range config.NotifyContainers {
166+
log.Printf("Sending container '%s' signal '%v'", killOpts.ID, killOpts.Signal)
167+
err := client.KillContainer(killOpts)
168+
if err != nil {
169+
log.Printf("Error sending signal to container: %s", err)
170+
}
171+
}
172+
}
173+
157174
func loadConfig(file string) error {
158175
_, err := toml.DecodeFile(file, &configs)
159176
if err != nil {
@@ -187,6 +204,7 @@ func generateAtInterval(client *docker.Client, configs ConfigFile) {
187204
// ignore changed return value. always run notify command
188205
generateFile(configCopy, containers)
189206
runNotifyCmd(configCopy)
207+
sendSignalToContainer(client, configCopy)
190208
case <-quit:
191209
ticker.Stop()
192210
return
@@ -226,6 +244,7 @@ func initFlags() {
226244
flag.BoolVar(&onlyExposed, "only-exposed", false, "only include containers with exposed ports")
227245
flag.BoolVar(&onlyPublished, "only-published", false, "only include containers with published ports (implies -only-exposed)")
228246
flag.StringVar(&notifyCmd, "notify", "", "run command after template is regenerated")
247+
flag.StringVar(&notifySigHUPContainerID, "notify-sighup", "", "send HUP signal to container. Equivalent to `docker kill -s HUP container-ID`")
229248
flag.StringVar(&configFile, "config", "", "config file with template directives")
230249
flag.IntVar(&interval, "interval", 0, "notify command interval (s)")
231250
flag.StringVar(&endpoint, "endpoint", "", "docker api endpoint")
@@ -253,13 +272,20 @@ func main() {
253272
}
254273
} else {
255274
config := Config{
256-
Template: flag.Arg(0),
257-
Dest: flag.Arg(1),
258-
Watch: watch,
259-
NotifyCmd: notifyCmd,
260-
OnlyExposed: onlyExposed,
261-
OnlyPublished: onlyPublished,
262-
Interval: interval,
275+
Template: flag.Arg(0),
276+
Dest: flag.Arg(1),
277+
Watch: watch,
278+
NotifyCmd: notifyCmd,
279+
NotifyContainers: make([]docker.KillContainerOptions, 0),
280+
OnlyExposed: onlyExposed,
281+
OnlyPublished: onlyPublished,
282+
Interval: interval,
283+
}
284+
if notifySigHUPContainerID != "" {
285+
config.NotifyContainers = append(config.NotifyContainers, docker.KillContainerOptions{
286+
ID: notifySigHUPContainerID,
287+
Signal: docker.SIGHUP,
288+
})
263289
}
264290
configs = ConfigFile{
265291
Config: []Config{config}}

0 commit comments

Comments
 (0)