From a507bef108af3da90b66937bc223aa3636e24472 Mon Sep 17 00:00:00 2001 From: Markus Pesch Date: Thu, 9 Jan 2020 21:50:27 +0100 Subject: [PATCH] fix(Makefile, Dockerfile): optimization of the container image building process --- .dockerignore | 1 + Dockerfile | 23 +++++++- Makefile | 148 ++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 135 insertions(+), 37 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c5e82d7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +bin \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index d64b8bd..f3d11db 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,20 @@ -FROM busybox:latest -COPY bin/linux/amd64/flucky /usr/bin/flucky -ENTRYPOINT [ "/usr/bin/flucky" ] \ No newline at end of file +# ARGs +# ================================== +ARG BASE_IMAGE +ARG BUILD_IMAGE +ARG EXECUTABLE +ARG EXECUTABLE_TARGET +ARG GOPROXY +ARG GOPRIVATE +ARG VERSION + +# BUILD +# ================================== +FROM ${BUILD_IMAGE} AS build +COPY . /workspace +RUN make ${EXECUTABLE_TARGET} VERSION=${VERSION} GOPROXY=${GOPROXY} GOPRIVATE=${GOPRIVATE} + +# TARGET +# ================================== +FROM ${BASE_IMAGE} +COPY --from=build /workspace/${EXECUTABLE_TARGET} /usr/bin/${EXECUTABLE} \ No newline at end of file diff --git a/Makefile b/Makefile index afdd48d..b216b1b 100644 --- a/Makefile +++ b/Makefile @@ -1,24 +1,16 @@ # VERSION/RELEASE # If no version is specified as a parameter of make, the last git hash # value is taken. -VERSION:=$(shell git describe --abbrev=0)+$(shell date +'%Y%m%d%H%I%S') +VERSION?=$(shell git describe --abbrev=0)+$(shell date +'%Y%m%d%H%I%S') RELEASE?=1 -# CONTAINER_IMAGE_VERSION -# Defines the version of the container image which has included the executable -# binary. This is somethimes different to the variable VERSION, because the -# container image version should be latest instead contains the latest git tag -# and hash sum. -CONTAINER_IMAGE_VERSION:=latest - -# CONTAINER_RUNTIME/BUILD_IMAGE -# The CONTAINER_RUNTIME variable will be used to specified the path to a -# container runtime. This is needed to start and run a container image defined -# by the BUILD_IMAGE variable. The BUILD_IMAGE container serve as build -# environment to execute the different make steps inside. Therefore, the bulid -# environment requires all necessary dependancies to build this project. -CONTAINER_RUNTIME?=$(shell which docker) -BUILD_IMAGE:=volkerraschek/build-image:latest +# GOPROXY settings +# If no GOPROXY environment variable available, the pre-defined GOPROXY from go +# env to download and validate go modules is used. Exclude downloading and +# validation of all private modules which are pre-defined in GOPRIVATE. If no +# GOPRIVATE variable defined, the variable of go env is used. +GOPROXY?=$(shell go env GOPROXY) +GOPRIVATE?=$(shell go env GOPRIVATE) # EXECUTABLE # Executable binary which should be compiled for different architecures @@ -69,11 +61,38 @@ EXECUTABLES:=\ EXECUTABLE_TARGETS:= \ ${UNIX_EXECUTABLE_TARGETS} +# CONTAINER_RUNTIME / BUILD_IMAGE +# The CONTAINER_RUNTIME variable will be used to specified the path to a +# container runtime. This is needed to start and run a container image defined +# by the BUILD_IMAGE variable. +CONTAINER_RUNTIME?=$(shell which docker) + +# BUILD_IMAGE +# The BUILD_IMAGE container serve as build environment to execute the different +# make steps inside. Therefore, the bulid environment requires all necessary +# dependancies to build this project. +BUILD_IMAGE:=docker.io/volkerraschek/build-image:latest + +# BASE_IMAGE +# Defines the name of the container base image on which should be built the new +# CONTAINER_IMAGE. +BASE_IMAGE=docker.io/library/alpine:3.11.2 + +# REGISTRY / CONTAINER_IMAGE +# Specification of the container registry. This is needed to build and push the +# container image on a container registry. Additionally, the CONTAINER_IMAGE +# variable is composed based on the REGISTRY_NAMESPACE, the CONTAINER_IMAGE_NAME +# and the CONTAINER_IMAGE_VERSION +REGISTRY_MIRROR:=docker.io +REGISTRY_NAMESPACE:=volkerraschek +CONTAINER_IMAGE_NAME:=${EXECUTABLE} +CONTAINER_IMAGE_VERSION:=latest +CONTAINER_IMAGE=${REGISTRY_NAMESPACE}/${CONTAINER_IMAGE_NAME}/${CONTAINER_IMAGE_VERSION:v%=%} + # BINARIES # ============================================================================== # current os -${EXECUTABLE}: bindata - CGO_ENABLED=0 go build -ldflags "-X main.version=${VERSION}" -o ${@} +${EXECUTABLE}: bin/tmp/${EXECUTABLE} # build all binaries PHONY:=all @@ -81,32 +100,84 @@ all: ${EXECUTABLE_TARGETS} # darwin os bin/darwin/386/${EXECUTABLE}: bindata - CGO_ENABLED=0 GOARCH=386 GOOS=darwin go build -ldflags "-X main.version=${VERSION}" -o ${@} + CGO_ENABLED=0 \ + GOOS=darwin \ + GOARCH=386 \ + GOPROXY=${GOPROXY} \ + GOPRIVATE=${GOPRIVATE} \ + go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} bin/darwin/amd64/${EXECUTABLE}: bindata - CGO_ENABLED=0 GOARCH=amd64 GOOS=darwin go build -ldflags "-X main.version=${VERSION}" -o ${@} + CGO_ENABLED=0 \ + GOOS=darwin \ + GOARCH=amd64 \ + GOPROXY=${GOPROXY} \ + GOPRIVATE=${GOPRIVATE} \ + go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} # freebsd os bin/freebsd/amd64/${EXECUTABLE}: bindata - CGO_ENABLED=0 GOARCH=amd64 GOOS=freebsd go build -ldflags "-X main.version=${VERSION}" -o ${@} + CGO_ENABLED=0 \ + GOOS=freebsd \ + GOARCH=amd64 \ + GOPROXY=${GOPROXY} \ + GOPRIVATE=${GOPRIVATE} \ + go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} # linux os bin/linux/386/${EXECUTABLE}: bindata - CGO_ENABLED=0 GOARCH=386 GOOS=linux go build -ldflags "-X main.version=${VERSION}" -o ${@} + CGO_ENABLED=0 \ + GOOS=linux \ + GOARCH=386 \ + GOPROXY=${GOPROXY} \ + GOPRIVATE=${GOPRIVATE} \ + go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} bin/linux/amd64/${EXECUTABLE}: bindata - CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -ldflags "-X main.version=${VERSION}" -o ${@} + CGO_ENABLED=0 \ + GOOS=linux \ + GOARCH=amd64 \ + GOPROXY=${GOPROXY} \ + GOPRIVATE=${GOPRIVATE} \ + go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} bin/linux/arm/5/${EXECUTABLE}: bindata - CGO_ENABLED=0 GOARM=5 GOARCH=arm GOOS=linux go build -ldflags "-X main.version=${VERSION}" -o ${@} + CGO_ENABLED=0 \ + GOOS=linux \ + GOARCH=arm \ + GOARM=5 \ + GOPROXY=${GOPROXY} \ + GOPRIVATE=${GOPRIVATE} \ + go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} bin/linux/arm/7/${EXECUTABLE}: bindata - CGO_ENABLED=0 GOARM=7 GOARCH=arm GOOS=linux go build -ldflags "-X main.version=${VERSION}" -o ${@} + CGO_ENABLED=0 \ + GOOS=linux \ + GOARCH=arm \ + GOARM=7 \ + GOPROXY=${GOPROXY} \ + GOPRIVATE=${GOPRIVATE} \ + go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} + +bin/tmp/${EXECUTABLE}: bindata + CGO_ENABLED=0 \ + GOPROXY=${GOPROXY} \ + GOPRIVATE=${GOPRIVATE} \ + go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} # GO-BINDATA # ============================================================================== -bindata: +BINDATA_TARGETS := \ + pkg/storage/db/bindataSQL.go \ + test/goldenfiles/bindata.go + +PHONY+=bindata +bindata: ${BINDATA_TARGETS} + +pkg/storage/db/bindataSQL.go: go-bindata -pkg db -o ./pkg/storage/db/bindataSQL.go ./pkg/storage/db/sql/*** ./pkg/storage/db/sql/psql/schema/*** + +test/goldenfiles/bindata.go: go-bindata -pkg goldenfiles -ignore ".*\.go" -o ./test/goldenfiles/bindata.go ./test/goldenfiles/*** # TEST @@ -125,7 +196,7 @@ test-update-all: ${EXECUTABLE} --exec-file "$<:/usr/bin/${EXECUTABLE}" \ --dir "systemd:/usr/lib/systemd/system" \ --license "Apache 2.0" \ - --version ${VERSION} \ + --version ${VERSION:v%=%} \ --release ${RELEASE} \ --out ${@} \ ${EXECUTABLE} @@ -134,21 +205,30 @@ test-update-all: ${EXECUTABLE} # ============================================================================== PHONY+=clean clean: - rm ${EXECUTABLE} || true - rm ${EXECUTABLE}.* || true - rm --recursive --force bin/ || true + rm --force ${BINDATA_TARGETS} || true + rm --force --recursive bin/ || true # CONTAINER IMAGE STEPS # ============================================================================== PHONY+=container-image/build/amd64 -container-image/build/amd64: bin/linux/amd64/${EXECUTABLE} +container-image/build/amd64: ${CONTAINER_RUNTIME} build \ - --tag volkerraschek/${EXECUTABLE}:${IMAGE_VERSION} \ + --build-arg BASE_IMAGE=${BASE_IMAGE} \ + --build-arg BUILD_IMAGE=${BUILD_IMAGE} \ + --build-arg EXECUTABLE=${EXECUTABLE} \ + --build-arg EXECUTABLE_TARGET=bin/linux/amd64/${EXECUTABLE} \ + --build-arg GOPROXY=${GOPROXY} \ + --build-arg GOPRIVATE=${GOPRIVATE} \ + --build-arg VERSION=${VERSION} \ + --file Dockerfile \ + --no-cache \ + --tag ${REGISTRY_MIRROR}/${CONTAINER_IMAGE} \ + --tag ${CONTAINER_IMAGE} \ . PHONY+=container-image/push/amd64 container-image/push/amd64: container-image/build/amd64 - ${CONTAINER_RUNTIME} push volkerraschek/${EXECUTABLE}:${IMAGE_VERSION} + ${CONTAINER_RUNTIME} push ${REGISTRY_MIRROR}/${CONTAINER_IMAGE} # CONTAINER STEPS - BINARY # ============================================================================== @@ -197,7 +277,7 @@ container-run: --volume ${PWD}:/workspace \ ${BUILD_IMAGE} \ make ${COMMAND} \ - VERSION=${VERSION} \ + VERSION=${VERSION:v%=%} \ RELEASE=${RELEASE} # REMOTE