Skip to content

Commit

Permalink
Fix: multiarch build by using crosscompilation
Browse files Browse the repository at this point in the history
Use quay.io/centos/centos:stream9 with the –platform=$BUILDPLATFORM flag,
in this case the image is pulled for the builder host's current architecture.
The BUILDOS and BUILDARCH args are used to download the right go binary for
the build platform.
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.

Signed-off-by: Yury Kulazhenkov <[email protected]>
  • Loading branch information
ykulazhenkov committed Nov 25, 2024
1 parent 546b351 commit 4222e29
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 26 deletions.
4 changes: 0 additions & 4 deletions .github/workflows/image-build-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 0 additions & 4 deletions .github/workflows/image-push-main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 0 additions & 4 deletions .github/workflows/image-push-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}
Expand Down
45 changes: 31 additions & 14 deletions cmd/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,27 +1,42 @@
FROM quay.io/centos/centos:stream9 as builder
FROM --platform=$BUILDPLATFORM quay.io/centos/centos:stream9 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}

ARG BUILDOS
ARG BUILDARCH
ENV BUILDOS=${BUILDOS:-linux}
ENV BUILDARCH=${BUILDARCH:-amd64}

ENV GOOS=${TARGETOS}
ENV GOARCH=${goarch:-$TARGETARCH}
ENV CGO_ENABLED=0
ENV GOFLAGS=-mod=vendor

WORKDIR /workdir

RUN dnf install -y wget

COPY go.mod .
COPY go.sum .

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
wget https://dl.google.com/go/go${GO_VERSION}.${BUILDOS}-${BUILDARCH}.tar.gz && \
tar -C /usr/local -xzf go${GO_VERSION}.${BUILDOS}-${BUILDARCH}.tar.gz && \
rm go${GO_VERSION}.${BUILDOS}-${BUILDARCH}.tar.gz

ENV PATH /usr/local/go/bin:$PATH
ENV PATH=/usr/local/go/bin:$PATH

COPY . .
RUN go mod download

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
COPY . .

RUN mkdir /workdir/bin
RUN go build -tags no_openssl -o /workdir/bin/ovs ./cmd/plugin
Expand All @@ -30,6 +45,8 @@ RUN go build -tags no_openssl -o /workdir/bin/ovs-mirror-producer ./cmd/mirror-p
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/* /

0 comments on commit 4222e29

Please sign in to comment.