From 1107b40788261b28073885a71c016a74b0653f0f Mon Sep 17 00:00:00 2001 From: Sunny Date: Tue, 12 Oct 2021 04:18:08 +0530 Subject: [PATCH] Use tonistiigi/xx for cross-platform builds Update the Dockerfile to use tonistiigi/xx to cross-compile the manager binaries natively and speed up the multi-arch image build time. Also, update github action for build to enable docker buildx. Signed-off-by: Sunny --- .github/workflows/build.yaml | 7 +++++++ Dockerfile | 15 +++++++++++++-- Makefile | 10 +++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b950895c..301f9984 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,6 +12,13 @@ jobs: steps: - name: checkout uses: actions/checkout@v2 + - name: Setup QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + - name: Setup Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 - name: Restore go cache uses: actions/cache@v1 with: diff --git a/Dockerfile b/Dockerfile index 8f260127..da59d14d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,16 @@ +ARG XX_VERSION=1.0.0-rc.2 + +FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx + # Build the manager binary -FROM golang:1.16-alpine as builder +FROM --platform=$BUILDPLATFORM golang:1.16-alpine AS builder + +# Copy the build utilities. +COPY --from=xx / / + +ARG TARGETPLATFORM +# Configure workspace. WORKDIR /workspace # copy modules manifests @@ -20,7 +30,8 @@ COPY controllers/ controllers/ COPY internal/ internal/ # build without giving the arch, so that it gets it from the machine -RUN CGO_ENABLED=0 go build -a -o image-reflector-controller main.go +ENV CGO_ENABLED=0 +RUN xx-go build -a -o image-reflector-controller main.go FROM alpine:3.13 diff --git a/Makefile b/Makefile index 2fb806ea..8e35f55c 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,11 @@ CRD_OPTIONS ?= crd:crdVersions=v1 ENVTEST_BIN_VERSION?=1.22.0 KUBEBUILDER_ASSETS?=$(shell $(SETUP_ENVTEST) use -i $(ENVTEST_BIN_VERSION) -p path) +# Allows for defining additional Docker buildx arguments, e.g. '--push'. +BUILD_ARGS ?= +# Architectures to build images for. +BUILD_PLATFORMS ?= linux/amd64,linux/arm64,linux/arm/v7 + # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) GOBIN=$(shell go env GOPATH)/bin @@ -77,7 +82,10 @@ generate: controller-gen # Build the docker image docker-build: test - docker build . -t ${IMG} + docker buildx build \ + --platform=$(BUILD_PLATFORMS) \ + -t ${IMG} \ + ${BUILD_ARGS} . # Push the docker image docker-push: