Confd is a Golang written binary that can help us make configuration files dynamic. It achieves this by providing a templating engine that is driven by backend data stores like etcd, consul, dynamodb, redis, vault, zookeeper.
A few days ago I started putting together a BYO load-balancing PoC where I wanted to use confd and Nginx. I realised however that some features that I needed from confd were not yet released. Not a problem; I was able to compile the master branch and package the resulting binary into an Nginx container all in one go, and without even having Golang installed on my machine. Here is how:
confd + Nginx with Docker Multi-Stage builds
First I will create my container startup script
This script launches nginx and confd in the container but tracks both processes so that I can exit the container if either of them fail.
Normally you want to have only once process per container. In my particular case I have inter-process signaling between confd and Nginx and therefore it is easier for me to keep both processes together.
Now I create my Multi-Stage build Dockerfile:
I denote a build stage by using the AS <STAGE-NAME> keyword:
FROM golang:1.8.3-alpine3.6 AS confd-build-stage. I can reference the stage by name further down when I am copying the resulting binary into the Nginx container.
Now I build my image by executing
docker build -t confd-nginx-local docker-confd-nginx.
DONE!, just about 15MB extra to the Nginx base alpine image.
Read more about the Multi-Stage Build feature on the Docker website.