From bb3536d37151fa5a14caeb5a7646abf46abeda9c Mon Sep 17 00:00:00 2001 From: Yury Kulazhenkov Date: Mon, 25 Nov 2024 10:24:15 +0200 Subject: [PATCH] Fix: multiarch build by moving the binaries build stage to the golang image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use golang:1.23 as the builder image in the Dockerfile. With the –platform=$BUILDPLATFORM flag, the image is pulled for the builder host's current architecture. Cross-compilation occurs in the builder image using TARGETOS and TARGETARCH build arguments to determine the target OS/arch. These args are set automatically by the multiarch-build process (with docker buildx). The final container image (registry.access.redhat.com/ubi9/ubi-minimal) is pulled for the correct target architecture, such as amd64 or arm64. This update fixes support for multiarch builds and speeds up image building, as cross-compilation is faster than compiling on a non-native platform. --- .github/workflows/image-build-test.yaml | 4 --- .github/workflows/image-push-main.yaml | 4 --- .github/workflows/image-push-release.yaml | 4 --- cmd/Dockerfile | 38 ++++++++++++----------- 4 files changed, 20 insertions(+), 30 deletions(-) diff --git a/.github/workflows/image-build-test.yaml b/.github/workflows/image-build-test.yaml index 87bff92e..917ce663 100644 --- a/.github/workflows/image-build-test.yaml +++ b/.github/workflows/image-build-test.yaml @@ -27,9 +27,5 @@ jobs: with: context: . push: false - # no need to explicitly set goarch, - # correct arch will be selected for each build platform - build-args: | - goarch= platforms: ${{ env.BUILD_PLATFORMS }} file: ./cmd/Dockerfile diff --git a/.github/workflows/image-push-main.yaml b/.github/workflows/image-push-main.yaml index 3419ed10..5fe74d24 100644 --- a/.github/workflows/image-push-main.yaml +++ b/.github/workflows/image-push-main.yaml @@ -45,10 +45,6 @@ jobs: with: context: . push: true - # no need to explicitly set goarch, - # correct arch will be selected for each build platform - build-args: | - goarch= platforms: ${{ env.BUILD_PLATFORMS }} tags: | ${{ env.IMAGE_NAME }}:latest diff --git a/.github/workflows/image-push-release.yaml b/.github/workflows/image-push-release.yaml index 120672a7..f45fe53b 100644 --- a/.github/workflows/image-push-release.yaml +++ b/.github/workflows/image-push-release.yaml @@ -47,10 +47,6 @@ jobs: with: context: . push: true - # no need to explicitly set goarch, - # correct arch will be selected for each build platform - build-args: | - goarch= platforms: ${{ env.BUILD_PLATFORMS }} tags: | ${{ steps.docker_meta.outputs.tags }} diff --git a/cmd/Dockerfile b/cmd/Dockerfile index fa677e40..9bb53c5c 100644 --- a/cmd/Dockerfile +++ b/cmd/Dockerfile @@ -1,35 +1,37 @@ -FROM quay.io/centos/centos:stream9 as builder +FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS builder -RUN mkdir /workdir -WORKDIR /workdir +# Support overriding target GOARCH during `make docker-build` +ARG goarch= -COPY go.mod . +# these variable are automatically set during the multiarch build by docker buildx +ARG TARGETOS +ARG TARGETARCH +ENV TARGETOS=${TARGETOS:-linux} +ENV TARGETARCH=${TARGETARCH:-amd64} -RUN dnf install -y wget +ENV GOOS=${TARGETOS} +ENV GOARCH=${goarch:-$TARGETARCH} +ENV CGO_ENABLED=0 +ENV GOFLAGS=-mod=vendor + +WORKDIR /workdir +RUN mkdir /workdir/bin -RUN GO_VERSION=$(sed -En 's/^go +(.*)$/\1/p' go.mod) && \ - wget https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz && \ - tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz && \ - rm go${GO_VERSION}.linux-amd64.tar.gz +COPY go.mod . +COPY go.sum . -ENV PATH /usr/local/go/bin:$PATH +RUN go mod download COPY . . -ENV GOOS linux -# Support overriding target GOARCH during `make docker-build` -ARG goarch=amd64 -ENV GOARCH=$goarch -ENV CGO_ENABLED 0 -ENV GOFLAGS -mod=vendor - -RUN mkdir /workdir/bin RUN go build -tags no_openssl -o /workdir/bin/ovs ./cmd/plugin RUN go build -tags no_openssl -o /workdir/bin/marker ./cmd/marker RUN go build -tags no_openssl -o /workdir/bin/ovs-mirror-producer ./cmd/mirror-producer RUN go build -tags no_openssl -o /workdir/bin/ovs-mirror-consumer ./cmd/mirror-consumer FROM registry.access.redhat.com/ubi9/ubi-minimal + RUN microdnf install -y findutils + COPY --from=builder /workdir/.version /.version COPY --from=builder /workdir/bin/* /