diff --git a/Dockerfile b/Dockerfile index 367ef66d..3fb131ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,17 @@ -FROM golang:1.23 AS build-env -ADD . /src +FROM --platform=$BUILDPLATFORM golang:1.23 AS build-env + +ARG TARGETPLATFORM +ARG BUILDPLATFORM +ARG TARGETARCH +ARG TARGETOS + +RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log + ENV CGO_ENABLED=0 -ENV GOOS=linux -ENV GOARCH=amd64 +ENV GOOS=${TARGETOS} +ENV GOARCH=${TARGETARCH} + +ADD . /src WORKDIR /src RUN go mod download RUN make init diff --git a/Makefile b/Makefile index 88c53390..7cd01fb1 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ SHELL = /bin/bash GIT_BRANCH:=$(shell git rev-parse --abbrev-ref HEAD | sed -e 's^/^-^g; s^[.]^-^g;' | tr '[:upper:]' '[:lower:]') GIT_COMMIT:=$(shell git rev-parse --short HEAD) IMG ?= perconalab/version-service:$(GIT_BRANCH)-$(GIT_COMMIT) +DOCKER_DEFAULT_PLATFORM ?= linux/amd64,linux/arm64 init: go build -modfile=tools/go.mod -o bin/yq github.com/mikefarah/yq/v3 @@ -14,7 +15,7 @@ init: curl -L "https://github.com/bufbuild/buf/releases/download/v1.34.0/buf-$(shell uname -s)-$(shell uname -m)" -o "./bin/buf" chmod +x ./bin/buf - curl -L https://github.com/go-swagger/go-swagger/releases/download/v0.31.0/swagger_$(shell uname | tr '[:upper:]' '[:lower:]')_amd64 -o ./bin/swagger + curl -L "https://github.com/go-swagger/go-swagger/releases/download/v0.31.0/swagger_$(shell uname -s)_$(shell uname -m | sed 's/aarch64/arm64/')" -o ./bin/swagger chmod +x ./bin/swagger gen: @@ -35,7 +36,7 @@ cert: # Build docker image docker-build: - docker build --platform=linux/amd64 . -t ${IMG} + DOCKER_DEFAULT_PLATFORM="$(DOCKER_DEFAULT_PLATFORM)" IMG="$(IMG)" ./tools/build.sh # Run docker image docker-run-it: diff --git a/tools/build.sh b/tools/build.sh new file mode 100755 index 00000000..9b3b4495 --- /dev/null +++ b/tools/build.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +if [[ -z $DOCKER_DEFAULT_PLATFORM ]]; then + echo "DOCKER_DEFAULT_PLATFORM is not specified. Use 'make docker-build'" + exit 1 +fi + +if [[ -z $IMG ]]; then + echo "IMG is not specified. Use 'make docker-build'" + exit 1 +fi + +if [[ ${DOCKER_PUSH:-1} == 1 ]]; then + imgresult="--push=true" +else + imgresult="--load" +fi + +if echo "$DOCKER_DEFAULT_PLATFORM" | grep -q ','; then + if [ "${DOCKER_PUSH:-1}" = 0 ]; then + echo "DOCKER_PUSH=0 option is not supported in case of multi-arch builds, please use DOCKER_PUSH=1" + exit 1 + fi +fi + +docker buildx build \ + --platform "$DOCKER_DEFAULT_PLATFORM" \ + --progress plain \ + --no-cache \ + $imgresult \ + -t "$IMG" \ + -f ./Dockerfile \ + .