From 4ec64aaacfde017a5700366a74638a3827c5cb6b Mon Sep 17 00:00:00 2001 From: Andrii Dema Date: Mon, 23 Dec 2024 06:43:37 +0200 Subject: [PATCH 1/2] CLOUD-873: multi-platform docker builds https://perconadev.atlassian.net/browse/CLOUD-873 --- Dockerfile | 17 +++++++++++++---- Makefile | 11 +++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) 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..cf7062f5 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 | tr '[:upper:]' '[:lower:]')_$(shell uname -m)" -o ./bin/swagger chmod +x ./bin/swagger gen: @@ -35,7 +36,13 @@ cert: # Build docker image docker-build: - docker build --platform=linux/amd64 . -t ${IMG} + docker buildx build \ + --platform "$(DOCKER_DEFAULT_PLATFORM)" \ + --progress plain \ + --no-cache \ + -t "$(IMG)" \ + -f ./Dockerfile \ + . # Run docker image docker-run-it: From f31d4bf0de6d0598134ab9a5d5e62d7666efddb3 Mon Sep 17 00:00:00 2001 From: Andrii Dema Date: Mon, 23 Dec 2024 07:23:16 +0200 Subject: [PATCH 2/2] fix --- Makefile | 10 ++-------- tools/build.sh | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) create mode 100755 tools/build.sh diff --git a/Makefile b/Makefile index cf7062f5..7cd01fb1 100644 --- a/Makefile +++ b/Makefile @@ -15,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:]')_$(shell uname -m)" -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: @@ -36,13 +36,7 @@ cert: # Build docker image docker-build: - docker buildx build \ - --platform "$(DOCKER_DEFAULT_PLATFORM)" \ - --progress plain \ - --no-cache \ - -t "$(IMG)" \ - -f ./Dockerfile \ - . + 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 \ + .