1 # build image for apiserver
3 # This image is built from files in this directory and pushed to
4 # a docker registry that is accesseble on each node.
8 # For a user created registry, the registry must be setup ahead of time.
9 # This Makefile supports both amd64 and arm64
12 SPACE := $(EMPTY) $(EMPTY)
13 COMMA := $(EMPTY),$(EMPTY)
16 LINUX_ARCH := amd64 arm64
20 PLATFORMS := $(subst $(SPACE),$(COMMA),$(foreach arch,$(LINUX_ARCH),linux/$(arch)))
22 # SECRET is used when pushing the manifest. docker-credential-gcr may not be
23 # available locally (except in Jenkins) so delay the evaluation unless the secret
25 SECRET = $(shell echo "https://gcr.io" | docker-credential-gcr get | jq '.Secret')
27 BUILD_ARCH ?= $(shell [ $$(uname -m) = "aarch64" ] && echo "arm64" || echo "amd64")
28 IMAGE_BASE ?= $(REGISTRY)/iec-apiserver-base-$(BUILD_ARCH)
31 GIT_VERSION ?= $(shell git describe --always --dirty --tags)
32 IMAGE_VERSION ?= $(GIT_VERSION)
33 IMAGE_TAG := $(shell echo $(IMAGE_VERSION) | cut -d. -f1,2)
34 IMAGE_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD | tr -d '/')
36 #Currently, we choose golang-alpine based image as the default image base due to its
39 @IMAGE_NAME="$(REGISTRY)/iec-apiserver-base"; \
40 docker build -t $$IMAGE_NAME-$(BUILD_ARCH) \
41 -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_VERSION) \
42 -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_TAG) \
43 -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_BRANCH) \
44 -f docker/Dockerfile.base \
47 #Use native golang based image as the base of apiserver, the reason to keep it here
48 #is that it is easier to extend if we need to add extra functions into it.
49 #It's kept here as a backup.
51 @IMAGE_NAME="$(REGISTRY)/iec-apiserver-base"; \
52 docker build -t $$IMAGE_NAME-$(BUILD_ARCH)-golang \
53 -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_VERSION) \
54 -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_TAG) \
55 -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_BRANCH) \
56 -f docker/Dockerfile.base.golang \
61 @IMAGE_NAME="$(REGISTRY)/iec-apiserver"; \
62 docker build -t $$IMAGE_NAME-$(BUILD_ARCH) \
63 -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_VERSION) \
64 -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_TAG) \
65 -t $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_BRANCH) \
66 --build-arg IMAGEBASE="${IMAGE_BASE}" \
67 -f docker/Dockerfile \
70 #Use golang image as the base, but only used as a backup now
71 .PHONY: apiserver-golang
73 @IMAGE_NAME="$(REGISTRY)/iec-apiserver"; \
74 docker build -t $$IMAGE_NAME-$(BUILD_ARCH)-golang \
75 -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_VERSION) \
76 -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_TAG) \
77 -t $$IMAGE_NAME-$(BUILD_ARCH)-golang:$(IMAGE_BRANCH) \
78 --build-arg IMAGEBASE="${IMAGE_BASE}"-golang \
79 -f docker/Dockerfile.golang \
85 #Before push images or push fat-manifest, please use 'docker login -u your_repo_account' to login to dockerhub first
86 #For docker login, it may need to install package 'jq', like "sudo apt-get install -y jq" for Debian based system
89 @IMAGE_NAME="$(REGISTRY)/iec-apiserver-base"; \
90 docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_VERSION); \
91 docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_TAG); \
92 docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_BRANCH); \
93 docker push $$IMAGE_NAME-$(BUILD_ARCH):$(TAG)
95 @IMAGE_NAME="$(REGISTRY)/iec-apiserver"; \
96 docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_VERSION); \
97 docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_TAG); \
98 docker push $$IMAGE_NAME-$(BUILD_ARCH):$(IMAGE_BRANCH); \
99 docker push $$IMAGE_NAME-$(BUILD_ARCH):$(TAG);
103 if [ ! -f "./manifest-tool" ]; then \
104 wget https://github.com/estesp/manifest-tool/releases/download/v0.9.0/manifest-tool-linux-$(BUILD_ARCH) \
105 -O manifest-tool && \
106 chmod +x ./manifest-tool; \
109 .push_manifest: pre_manifest
110 ./manifest-tool push from-args --platforms $(PLATFORMS) --template $(REGISTRY)/$(TARGET)-ARCH:$(VERSION) --target $(REGISTRY)/$(TARGET):$(VERSION)
113 #Note: Currently, just multi-arch the latest version of the images to avoid the possible version
114 #mismatch between amd64 and arm64 in docker hub. In case we need them, we can just remove the comment tags below
115 #Just multi-arch the iec-apiserver image currently
118 #$(MAKE) .push_manifest VERSION=$(TAG) TARGET="iec-apiserver-base"
119 $(MAKE) .push_manifest VERSION=$(TAG) TARGET="iec-apiserver"
121 push: pre_manifest push_images multi_arch
122 #$(MAKE) .push_manifest VERSION=$(IMAGE_VERSION) TARGET="iec-apiserver-base"
123 #$(MAKE) .push_manifest VERSION=$(IMAGE_TAG) TARGET="iec-apiserver-base"
124 #$(MAKE) .push_manifest VERSION=$(IMAGE_VERSION) TARGET="iec-apiserver"
125 #$(MAKE) .push_manifest VERSION=$(IMAGE_TAG) TARGET="iec-apiserver"
127 #For cleaning images, it seems more stable when we remove it by their names, not just by their ids.
129 #$(DOCKER) rmi -f `$(DOCKER) images $(REGISTRY)/$(TARGET) -a -q` || true
130 $(DOCKER) rmi -f $(REGISTRY)/$(TARGET):$(VERSION) || true
132 #Normally, we don't remove the base image to keep a stable Revel version for use
134 docker rmi $(docker images --filter "dangling=true" -q --no-trunc) || true
135 #$(MAKE) clean_image TARGET=iec-apiserver-base-$(BUILD_ARCH) VERSION=$(IMAGE_VERSION)
136 #$(MAKE) clean_image TARGET=iec-apiserver-base-$(BUILD_ARCH) VERSION=$(IMAGE_TAG)
137 #$(MAKE) clean_image TARGET=iec-apiserver-base-$(BUILD_ARCH) VERSION=$(IMAGE_BRANCH)
138 #$(MAKE) clean_image TARGET=iec-apiserver-base-$(BUILD_ARCH) VERSION=$(TAG)
140 $(MAKE) clean_image TARGET=iec-apiserver-$(BUILD_ARCH) VERSION=$(IMAGE_VERSION)
141 $(MAKE) clean_image TARGET=iec-apiserver-$(BUILD_ARCH) VERSION=$(IMAGE_TAG)
142 $(MAKE) clean_image TARGET=iec-apiserver-$(BUILD_ARCH) VERSION=$(IMAGE_BRANCH)
143 $(MAKE) clean_image TARGET=iec-apiserver-$(BUILD_ARCH) VERSION=$(TAG)