Skip to content

Commit 9455238

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

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 map[string]docker.Signal
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,23 @@ 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 container, signal := range config.NotifyContainers {
166+
log.Printf("Sending container '%s' signal '%v'", container, signal)
167+
killOpts := docker.KillContainerOptions{
168+
ID: container,
169+
Signal: signal,
170+
}
171+
if err := client.KillContainer(killOpts); err != nil {
172+
log.Printf("Error sending signal to container: %s", err)
173+
}
174+
}
175+
}
176+
157177
func loadConfig(file string) error {
158178
_, err := toml.DecodeFile(file, &configs)
159179
if err != nil {
@@ -187,6 +207,7 @@ func generateAtInterval(client *docker.Client, configs ConfigFile) {
187207
// ignore changed return value. always run notify command
188208
generateFile(configCopy, containers)
189209
runNotifyCmd(configCopy)
210+
sendSignalToContainer(client, configCopy)
190211
case <-quit:
191212
ticker.Stop()
192213
return
@@ -226,6 +247,7 @@ func initFlags() {
226247
flag.BoolVar(&onlyExposed, "only-exposed", false, "only include containers with exposed ports")
227248
flag.BoolVar(&onlyPublished, "only-published", false, "only include containers with published ports (implies -only-exposed)")
228249
flag.StringVar(&notifyCmd, "notify", "", "run command after template is regenerated")
250+
flag.StringVar(&notifySigHUPContainerID, "notify-sighup", "", "send HUP signal to container. Equivalent to `docker kill -s HUP container-ID`")
229251
flag.StringVar(&configFile, "config", "", "config file with template directives")
230252
flag.IntVar(&interval, "interval", 0, "notify command interval (s)")
231253
flag.StringVar(&endpoint, "endpoint", "", "docker api endpoint")
@@ -253,13 +275,17 @@ func main() {
253275
}
254276
} else {
255277
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,
278+
Template: flag.Arg(0),
279+
Dest: flag.Arg(1),
280+
Watch: watch,
281+
NotifyCmd: notifyCmd,
282+
NotifyContainers: make(map[string]docker.Signal),
283+
OnlyExposed: onlyExposed,
284+
OnlyPublished: onlyPublished,
285+
Interval: interval,
286+
}
287+
if notifySigHUPContainerID != "" {
288+
config.NotifyContainers[notifySigHUPContainerID] = docker.SIGHUP
263289
}
264290
configs = ConfigFile{
265291
Config: []Config{config}}

0 commit comments

Comments
 (0)