|
| 1 | +.PHONY: all clean images |
| 2 | +.DEFAULT_GOAL := all |
| 3 | + |
| 4 | +# Boiler plate for bulding Docker containers. |
| 5 | +# All this must go at top of file I'm afraid. |
| 6 | +IMAGE_PREFIX := quay.io/weaveworks/build- |
| 7 | +IMAGE_TAG := $(shell ../image-tag) |
| 8 | +UPTODATE := .uptodate |
| 9 | + |
| 10 | +# Every directory with a Dockerfile in it builds an image called |
| 11 | +# $(IMAGE_PREFIX)<dirname>. Dependencies (i.e. things that go in the image) |
| 12 | +# still need to be explicitly declared. |
| 13 | +%/$(UPTODATE): %/Dockerfile %/* |
| 14 | + $(SUDO) docker build -t $(IMAGE_PREFIX)$(shell basename $(@D)) $(@D)/ |
| 15 | + $(SUDO) docker tag $(IMAGE_PREFIX)$(shell basename $(@D)) $(IMAGE_PREFIX)$(shell basename $(@D)):$(IMAGE_TAG) |
| 16 | + touch $@ |
| 17 | + |
| 18 | +# Get a list of directories containing Dockerfiles |
| 19 | +DOCKERFILES := $(shell find . -name tools -prune -o -name vendor -prune -o -type f -name 'Dockerfile' -print) |
| 20 | +UPTODATE_FILES := $(patsubst %/Dockerfile,%/$(UPTODATE),$(DOCKERFILES)) |
| 21 | +DOCKER_IMAGE_DIRS := $(patsubst %/Dockerfile,%,$(DOCKERFILES)) |
| 22 | +IMAGE_NAMES := $(foreach dir,$(DOCKER_IMAGE_DIRS),$(patsubst %,$(IMAGE_PREFIX)%,$(shell basename $(dir)))) |
| 23 | +images: |
| 24 | + $(info $(IMAGE_NAMES)) |
| 25 | + @echo > /dev/null |
| 26 | + |
| 27 | +# Define imagetag-golang, etc, for each image, which parses the dockerfile and |
| 28 | +# prints an image tag. For example: |
| 29 | +# FROM golang:1.8.1-stretch |
| 30 | +# in the "foo/Dockerfile" becomes: |
| 31 | +# $ make imagetag-foo |
| 32 | +# 1.8.1-stretch |
| 33 | +define imagetag_dep |
| 34 | +.PHONY: imagetag-$(1) |
| 35 | +$(patsubst $(IMAGE_PREFIX)%,imagetag-%,$(1)): $(patsubst $(IMAGE_PREFIX)%,%,$(1))/Dockerfile |
| 36 | + @cat $$< | grep "^FROM " | head -n1 | sed 's/FROM \(.*\):\(.*\)/\2/' |
| 37 | +endef |
| 38 | +$(foreach image, $(IMAGE_NAMES), $(eval $(call imagetag_dep, $(image)))) |
| 39 | + |
| 40 | +all: $(UPTODATE_FILES) |
| 41 | + |
| 42 | +clean: |
| 43 | + $(SUDO) docker rmi $(IMAGE_NAMES) >/dev/null 2>&1 || true |
| 44 | + rm -rf $(UPTODATE_FILES) |
| 45 | + |
| 46 | + |
0 commit comments