Skip to content

Commit 9dd9114

Browse files
committed
it all works now
1 parent 0a1d62d commit 9dd9114

File tree

3 files changed

+37
-14
lines changed

3 files changed

+37
-14
lines changed

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# dockerhook
2+
3+
Daemon that listens for Docker events and triggers a hook script for each event, passing any container data to STDIN.
4+
5+
## Notes
6+
7+
Currently using a patched version of Docker client, so building may fail for you. There is a binary release available for now.

debughook

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
mkdir -p /tmp/dockerhook/$1
3+
cat > /tmp/dockerhook/$1/$2

dockerhook.go

+27-14
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"log"
55
"os"
66
"flag"
7+
"strings"
8+
"fmt"
79
"path/filepath"
810
"os/exec"
911
"syscall"
@@ -18,6 +20,12 @@ var debug = flag.Bool("d", false, "debug mode displays handler output")
1820
var env = flag.Bool("e", false, "pass environment to handler")
1921
var shell = flag.Bool("s", false, "run handler via SHELL")
2022

23+
var skipInspect = map[string]bool {
24+
"destroy": true,
25+
"untag": true,
26+
"delete": true,
27+
}
28+
2129
func init() {
2230
flag.Usage = func() {
2331
fmt.Fprintf(os.Stderr, "Usage: %v [options] <hook-handler>\n\n", os.Args[0])
@@ -52,25 +60,26 @@ func exitStatus(err error) (int, error) {
5260
return 0, nil
5361
}
5462

55-
func inspect(docker *dockerapi.Client, id string) bytes.Buffer {
63+
func inspect(docker *dockerapi.Client, id string) *bytes.Buffer {
5664
var b bytes.Buffer
5765
container, err := docker.InspectContainer(id)
5866
if err != nil {
5967
log.Println("warn: unable to inspect container:", id[:12], err)
60-
return b
68+
return &b
6169
}
62-
data, err := json.Marshal(m)
70+
data, err := json.Marshal(container)
6371
if err != nil {
6472
log.Println("warn: unable to marshal container data:", id[:12], err)
65-
return b
73+
return &b
6674
}
6775
b.Write(data)
68-
return b
76+
return &b
6977
}
7078

71-
func trigger(hook []string, event, id string, data bytes.Buffer) {
79+
func trigger(hook []string, event, id string, docker *dockerapi.Client) {
80+
log.Println("info: trigger:", id[:12], event)
7281
hook = append(hook, event, id)
73-
var cmd exec.Cmd
82+
var cmd *exec.Cmd
7483
if *shell {
7584
cmd = exec.Command(os.Getenv("SHELL"), "-c", strings.Join(hook, " "))
7685
} else {
@@ -79,7 +88,9 @@ func trigger(hook []string, event, id string, data bytes.Buffer) {
7988
if !*env {
8089
cmd.Env = []string{}
8190
}
82-
cmd.Stdin = data
91+
if !skipInspect[event] {
92+
cmd.Stdin = inspect(docker, id)
93+
}
8394
if *debug {
8495
cmd.Stdout = os.Stdout // TODO: wrap in log output
8596
}
@@ -92,12 +103,12 @@ func trigger(hook []string, event, id string, data bytes.Buffer) {
92103

93104
func main() {
94105
flag.Parse()
95-
if flag.NArg() < 2 {
106+
if flag.NArg() < 1 {
96107
flag.Usage()
97108
os.Exit(64)
98109
}
99110

100-
hook, err := shlex.Split(flag.Arg(1))
111+
hook, err := shlex.Split(flag.Arg(0))
101112
if err != nil {
102113
log.Fatalln("fatal: unable to parse handler command:", err)
103114
}
@@ -106,21 +117,23 @@ func main() {
106117
log.Fatalln("fatal: invalid handler executable path:", err)
107118
}
108119

109-
docker, err := dockerapi.NewClient(getopt("DOCKER_HOST", "unix:///var/run/docker.sock"))
120+
if os.Getenv("DOCKER_HOST") == "" {
121+
assert(os.Setenv("DOCKET_HOST", "unix:///var/run/docker.sock"))
122+
}
123+
docker, err := dockerapi.NewClientFromEnv()
110124
assert(err)
111125

112126
containers, err := docker.ListContainers(dockerapi.ListContainersOptions{})
113127
assert(err)
114128
for _, listing := range containers {
115-
trigger(hook, "exists", listing.ID, inspect(docker, listing.ID))
129+
trigger(hook, "exists", listing.ID, docker)
116130
}
117131

118132
events := make(chan *dockerapi.APIEvents)
119133
assert(docker.AddEventListener(events))
120134
log.Println("info: listening for Docker events...")
121135
for msg := range events {
122-
log.Println("info: event:", msg.Status, msg.ID[:12])
123-
go trigger(hook, msg.Status, msg.ID, inspect(docker, msg.ID))
136+
go trigger(hook, msg.Status, msg.ID, docker)
124137
}
125138

126139
log.Fatal("fatal: docker event loop closed") // todo: reconnect?

0 commit comments

Comments
 (0)