-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMakefile
114 lines (93 loc) · 4.5 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
SHELL := /bin/bash
PUBLIC_DOCKER_REGISTRY = docker.io
DOCKER_PROJECT = linkernetworks
BUILD_DATE := $(shell date +%Y.%m.%d.%H:%M:%S)
GIT_SYMREF := $(shell git rev-parse --abbrev-ref HEAD | sed -e 's![^A-Za-z0-9]!-!g')
GIT_REV_SHORT := $(shell git rev-parse --short HEAD)
GIT_DESCRIBE := $(shell git describe --all --long)
BUILD_REVISION := $(GIT_REV_SHORT)
# container image definitions
# IMAGE_TAG := latest
# IMAGE_TAG := $(shell git rev-parse --abbrev-ref HEAD)
ifeq ($(IMAGE_TAG),)
IMAGE_TAG := $(GIT_SYMREF)-$(GIT_REV_SHORT)
endif
# image anchor tag should refers to "latest" or "develop"
ifeq ($(IMAGE_ANCHOR_TAG),)
IMAGE_ANCHOR_TAG := $(GIT_SYMREF)
endif
# The DOCKERFILE_VARIANT can be specified from the command line arguments
# to build a specific Dockerfile. for example, "Dockerfile.gpu", e.g.,
#
# make trainer-image-caffe-trainer DOCKERFILE_VARIANT=".gpu"
#
# DOCKER_BUILD_FLAGS=--quiet
NOTEBOOK_DOCKERFILES := $(sort $(wildcard env/*/*/Dockerfile$(DOCKERFILE_VARIANT)))
NOTEBOOK_DIRS := $(patsubst %/Dockerfile,%,$(NOTEBOOK_DOCKERFILES))
NOTEBOOK_VER := $(subst /,-,$(NOTEBOOK_DIRS))
NOTEBOOK_NAMES := $(patsubst env-%,%,$(NOTEBOOK_VER))
NOTEBOOK_TARGETS := $(addprefix notebook-image-,$(NOTEBOOK_NAMES))
debug:
@echo $(NOTEBOOK_DIRS)
BASE_DOCKERFILES := $(sort $(wildcard base/*/Dockerfile$(DOCKERFILE_VARIANT)))
BASE_DIRS := $(patsubst %/Dockerfile,%,$(basename $(BASE_DOCKERFILES)))
BASE_NAMES := $(notdir $(BASE_DIRS))
BASE_TARGETS := $(addprefix base-image-,$(BASE_NAMES))
PUSH_NOTEBOOK_IMAGES := $(addprefix push-notebook-image-,$(NOTEBOOK_NAMES))
PUSH_BASE_IMAGES := $(addprefix push-base-image-,$(BASE_NAMES))
IMAGE_NAMES := $(BASE_NAMES) $(NOTEBOOK_NAMES)
CLEAN_NOTEBOOK_IMAGES := $(addprefix clean-image-,$(IMAGE_NAMES))
all: base-images push-base-images notebook-images push-notebook-images
# the first pattern % will locate the Dockerfile,
# the given DOCKERFILE_VARIANT can be used for specifying which Dockerfile to use.
# when DOCKERFILE_VARIANT is given, the tag :latest won't be used.
# It will make two tags caffe:1.0-gpu/ caffe-1.0:master.
.SECONDEXPANSION:
notebook-image-%: env/$$(subst -,/,%)/Dockerfile$(DOCKERFILE_VARIANT) $$(shell find env -type f)
ifeq ($(strip $(DOCKERFILE_VARIANT)),)
time docker build $(DOCKER_BUILD_FLAGS) \
--tag $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$(notdir $(patsubst %/, %, $(dir $(patsubst %/Dockerfile,%,$(basename $<))))):$(notdir $(patsubst %/Dockerfile,%,$(basename $<))) \
--tag $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*:$(IMAGE_ANCHOR_TAG) \
--file $< \
$(dir $<)
else
time docker build $(DOCKER_BUILD_FLAGS) \
--tag $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$(notdir $(patsubst %/, %, $(dir $(patsubst %/Dockerfile,%,$(basename $<))$(subst .,-,$(DOCKERFILE_VARIANT))))):$(notdir $(patsubst %/Dockerfile,%,$(basename $<)))$(subst .,-,$(DOCKERFILE_VARIANT)) \
--tag $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*:$(IMAGE_ANCHOR_TAG)$(subst .,-,$(DOCKERFILE_VARIANT)) \
--file $< \
$(dir $<)
endif
base-image-%: base/%/Dockerfile$(DOCKERFILE_VARIANT) $(shell find base/$* -type f)
ifeq ($(strip $(DOCKERFILE_VARIANT)),)
time docker build $(DOCKER_BUILD_FLAGS) \
--build-arg CACHE_DATE=$(BUILD_DATE) \
--tag $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*:$(IMAGE_TAG) \
--tag $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*:$(IMAGE_ANCHOR_TAG) \
--file $< \
$(dir $<)
else
time docker build $(DOCKER_BUILD_FLAGS) \
--tag $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*:$(IMAGE_TAG)$(subst .,-,$(DOCKERFILE_VARIANT)) \
--tag $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*:$(IMAGE_ANCHOR_TAG)$(subst .,-,$(DOCKERFILE_VARIANT)) \
--file $< \
$(dir $<)
endif
clean-notebook-images: $(CLEAN_NOTEBOOK_IMAGES)
clean-image-%:
ifeq ($(strip $(DOCKERFILE_VARIANT)),)
docker rmi -f $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*:$(IMAGE_ANCHOR_TAG) || true
else
docker rmi -f $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*:$(IMAGE_ANCHOR_TAG)$(subst .,-,$(DOCKERFILE_VARIANT)) || true
endif
notebook-images: $(NOTEBOOK_TARGETS)
base-images: $(BASE_TARGETS)
list-images:
@echo $(NOTEBOOK_TARGETS) $(BASE_TARGETS)
clean: clean-notebook-images
.SECONDEXPANSION:
push-notebook-image-%: env/$$(subst -,/,%)/Dockerfile$(DOCKERFILE_VARIANT) $$(shell find env -type f)
docker push $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$(notdir $(patsubst %/, %, $(dir $(patsubst %/Dockerfile,%,$(basename $<)))))
push-base-image-%:
docker push $(PUBLIC_DOCKER_REGISTRY)/$(DOCKER_PROJECT)/$*
push-notebook-images: $(PUSH_NOTEBOOK_IMAGES)
push-base-images: $(PUSH_BASE_IMAGES)