Skip to content

Instantly share code, notes, and snippets.

@psi-4ward
Created April 15, 2015 08:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save psi-4ward/215cef0681329fdc5ae7 to your computer and use it in GitHub Desktop.
Save psi-4ward/215cef0681329fdc5ae7 to your computer and use it in GitHub Desktop.
Service Discovery for Docker to update PowerDNS MySQL
#!/bin/bash
# watch events until infinity
UNTIL=99999999999
# respect events 30sec in the past to not forget
# started containers AFTER "register running" but BEFORE event listener starts
SINCE=$(expr `date +%s` - 30)
DOMAIN=fubar
PDNS=powerdns
# clear oldrecords
docker exec $PDNS manage delrecord "$HOSTNAME-%"
# register all current running containers
docker ps -q \
| while read -r LINE
do
CID=`docker inspect --format '{{ .Id }}' $LINE 2>/dev/null` || continue;
NAME=`docker inspect --format '{{ .Name }}' $LINE 2>/dev/null` || continue;
NAME=${NAME:1}
IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' $LINE`
docker exec $PDNS manage addrecord $DOMAIN $NAME A $IP 60 $HOSTNAME-$CID
done
# start watching for events
docker events --since=$SINCE --until=$UNTIL \
| while read -r LINE
do
if [[ ! $LINE =~ ^(.+)\ (.+):\ \(from\ (.+)\)\ (.+)$ ]] ; then
echo no match: $LINE
continue;
fi
DATE="${BASH_REMATCH[1]}"
CID="${BASH_REMATCH[2]}"
EVENT="${BASH_REMATCH[4]}"
# Container started
if [ "$EVENT" = "start" ] ; then
# be failor tolereant cause of --since
NAME=`docker inspect --format '{{ .Name }}' $CID 2>/dev/null` || continue;
NAME=${NAME:1}
IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CID`
# skip container without name or ip
if [ "$NAME" = "" ] || [ "$IP" = "" ] ; then
continue;
fi
docker exec $PDNS manage addrecord $DOMAIN $NAME A $IP 60 $HOSTNAME-$CID
fi
# Container stopped
if [ "$EVENT" = "die" ] ; then
docker exec $PDNS manage delrecord $HOSTNAME-$CID
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment