diff --git a/README.md b/README.md index 359f8534..e5b5d925 100644 --- a/README.md +++ b/README.md @@ -223,9 +223,18 @@ dest = "/etc/nginx/conf.d/default.conf" watch = true wait = "500ms:2s" +[[config]] +template = "/etc/docker-gen/templates/cnames.tmpl" +dest = "etc/dnsmasq.d/05-pihole-custom-cname.conf" +watch = true +wait = "500ms:2s" + [config.NotifyContainers] nginx = 1 # 1 is a signal number to be sent; here SIGHUP e75a60548dc9 = 1 # a key can be either container name (nginx) or ID + +[config.NotifyContainersCmd] +pihole = ["pihole", "reloaddns"] ``` --- diff --git a/internal/config/config.go b/internal/config/config.go index bb490e39..b51a8126 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -16,6 +16,7 @@ type Config struct { NotifyContainers map[string]int NotifyContainersFilter map[string][]string NotifyContainersSignal int + NotifyContainersCmd map[string][]string ContainerFilter map[string][]string Interval int KeepBlankLines bool diff --git a/internal/generator/generator.go b/internal/generator/generator.go index 613d7924..d34db9c2 100644 --- a/internal/generator/generator.go +++ b/internal/generator/generator.go @@ -1,6 +1,7 @@ package generator import ( + "bytes" "fmt" "log" "os" @@ -217,6 +218,7 @@ func (g *generator) generateFromEvents() { g.runNotifyCmd(cfg) g.sendSignalToContainers(cfg) g.sendSignalToFilteredContainers(cfg) + g.sendCmdToContainers(cfg) } }(cfg) } @@ -388,6 +390,54 @@ func (g *generator) sendSignalToFilteredContainers(config config.Config) { } } +func (g *generator) sendCmdToContainers(config config.Config) { + if len(config.NotifyContainersCmd) < 1 { + return + } + for container, cmd := range config.NotifyContainersCmd { + log.Printf("Sending container '%s' cmd '%s'", container, cmd) + + createOpts := docker.CreateExecOptions{ + Container: container, + AttachStdout: true, + AttachStderr: true, + Tty: true, + Cmd: cmd, + } + + execObj, err := g.Client.CreateExec(createOpts) + if err != nil { + log.Printf("Error creating cmd execution: %s", err) + continue + } + + var stdout bytes.Buffer + + startOpts := docker.StartExecOptions{ + OutputStream: &stdout, + Tty: true, + RawTerminal: true, + } + + err := g.Client.StartExec(execObj.ID, startOpts) + if err != nil { + log.Printf("Error executing command for container %s: %v", container, execErr) + continue + } + + inspect, err := g.Client.InspectExec(execObj.ID) + if err != nil { + log.Printf("Error inspecting exec for container %s: %v", container, err) + continue + } + if inspect.ExitCode != 0 { + log.Printf("Command failed on container %s. Exit Code: %d. Output: %s", container, inspect.ExitCode, stdout.String()) + } else { + log.Printf("Command executed successfully on container %s. Output: %s", container, stdout.String()) + } + } +} + func (g *generator) getContainers(config config.Config) ([]*context.RuntimeContainer, error) { apiInfo, err := g.Client.Info() if err != nil {