From b8e4dd03ddb7fb324cf44e70759a351b737abf0a Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Fri, 22 Jan 2016 11:58:38 +0000 Subject: [PATCH] add process to send HUP signals to docker on config updates Signed-off-by: Justin Cormack --- alpine/packages/hupper/.gitignore | 1 + alpine/packages/hupper/Dockerfile | 15 ++++++++ alpine/packages/hupper/Makefile | 10 ++++++ alpine/packages/hupper/etc/init.d/hupper | 39 ++++++++++++++++++++ alpine/packages/hupper/main.go | 45 ++++++++++++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 alpine/packages/hupper/.gitignore create mode 100644 alpine/packages/hupper/Dockerfile create mode 100644 alpine/packages/hupper/Makefile create mode 100755 alpine/packages/hupper/etc/init.d/hupper create mode 100644 alpine/packages/hupper/main.go diff --git a/alpine/packages/hupper/.gitignore b/alpine/packages/hupper/.gitignore new file mode 100644 index 000000000..f73cf663d --- /dev/null +++ b/alpine/packages/hupper/.gitignore @@ -0,0 +1 @@ +hupper diff --git a/alpine/packages/hupper/Dockerfile b/alpine/packages/hupper/Dockerfile new file mode 100644 index 000000000..c9f777b88 --- /dev/null +++ b/alpine/packages/hupper/Dockerfile @@ -0,0 +1,15 @@ +FROM golang:alpine + +RUN apk update && apk upgrade && apk add git + +RUN mkdir -p /go/src/hupper +WORKDIR /go/src/hupper + +COPY . /go/src/hupper/ + +ARG GOARCH +ARG GOOS + +RUN go get && go install + +RUN [ -f /go/bin/*/hupper ] && mv /go/bin/*/hupper /go/bin/ || true diff --git a/alpine/packages/hupper/Makefile b/alpine/packages/hupper/Makefile new file mode 100644 index 000000000..5e541d651 --- /dev/null +++ b/alpine/packages/hupper/Makefile @@ -0,0 +1,10 @@ +all: hupper + +hupper: Dockerfile main.go + docker build --build-arg GOOS=$(OS) --build-arg GOARCH=$(ARCH) -t hupper:build . + docker run hupper:build cat /go/bin/hupper > hupper + chmod 755 hupper + +clean: + rm -f hupper + docker images -q hupper:build | xargs docker rmi -f diff --git a/alpine/packages/hupper/etc/init.d/hupper b/alpine/packages/hupper/etc/init.d/hupper new file mode 100755 index 000000000..3057983de --- /dev/null +++ b/alpine/packages/hupper/etc/init.d/hupper @@ -0,0 +1,39 @@ +#!/sbin/openrc-run + +description="docker config update manager" + +depend() +{ + need 9pinit docker +} + +start() +{ + + [ -d /Database ] || exit 0 + + ebegin "Starting docker config update manager" + + [ -n "${PIDFILE}" ] || PIDFILE=/var/run/hupper.pid + + start-stop-daemon --start --quiet \ + --background \ + --exec /bin/hupper \ + --make-pidfile --pidfile ${PIDFILE} \ + -- + + eend $? "Failed to start hupper" +} + +stop() +{ + [ -d /Databse ] || exit 0 + + ebegin "Stopping docker config update manager" + + [ -n "${PIDFILE}" ] || PIDFILE=/var/run/hupper.pid + + start-stop-daemon --stop --quiet --pidfile ${PIDFILE} + + eend $? "Failed to stop hupper" +} diff --git a/alpine/packages/hupper/main.go b/alpine/packages/hupper/main.go new file mode 100644 index 000000000..1de436f59 --- /dev/null +++ b/alpine/packages/hupper/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "flag" + "io/ioutil" + "log" + "os" + "strconv" + "syscall" +) + +var ( + path string + pidfile string +) + +func init() { + flag.StringVar(&path, "path", "/Database/branch/master/watch/com.docker.driver.amd64-linux.node/etc.node/docker.node/daemon.json.node/tree.live", "path of the file to watch") + flag.StringVar(&pidfile, "pidfile", "/run/docker.pid", "pidfile for process to signal") +} + +func main() { + log.SetFlags(0) + flag.Parse() + + watch, err := os.Open(path) + if err != nil { + log.Fatalln("Failed to open file", path, err) + } + buf := make([]byte, 512) + for { + _, err := watch.Read(buf) + if err != nil { + log.Fatalln("Error reading watch file", err) + } + bytes, err := ioutil.ReadFile(pidfile) + pidstring := string(bytes[:]) + if err != nil { + pid, err := strconv.Atoi(pidstring) + if err != nil { + syscall.Kill(pid, syscall.SIGHUP) + } + } + } +}