22FROM --platform=$BUILDPLATFORM golang:1.23-bookworm AS builder
33
44WORKDIR /workspace
5+
56# Copy the Go Modules manifests
6- COPY go.mod go.mod
7- COPY go.sum go.sum
8- # cache deps before building and copying source so that we don't need to re-download as much
9- # and so that source changes don't invalidate our downloaded layer
7+ COPY go.mod go.sum ./
8+
9+ # Cache dependencies before copying source code
1010RUN --mount=type=cache,target=/root/.cache/go-build \
1111 --mount=type=cache,target=/go/pkg \
1212 go mod download
1313
14- # Copy the go source
14+ # Copy the Go source code
1515COPY api/ api/
1616COPY internal/ internal/
1717COPY cmd/ cmd/
1818COPY hack/ hack/
1919
2020ARG TARGETOS
2121ARG TARGETARCH
22+ ARG BUILDPLATFORM
23+ ENV BUILDARCH=${BUILDPLATFORM##*/}
2224
25+ # Install common dependencies
2326RUN apt-get update && apt-get install -y --no-install-recommends \
24- qemu-utils ca-certificates libvirt-clients libcephfs-dev librbd-dev librados-dev libc-bin gcc \
27+ qemu-user-static qemu-utils ca-certificates \
28+ libvirt-clients libcephfs-dev librbd-dev librados-dev libc-bin \
29+ gcc g++ \
2530 && update-ca-certificates \
2631 && rm -rf /var/lib/apt/lists/*
2732
28- # Build
29- RUN --mount=type=cache,target=/root/.cache/go-build \
30- --mount=type=cache,target=/go/pkg \
31- CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH GO111MODULE=on go build -ldflags="-s -w" -a -o libvirt-provider ./cmd/libvirt-provider/main.go
33+ # Install cross-compiler for ARM64 if building for arm64 on an amd64 host
34+ RUN if [ "$TARGETARCH" = "arm64" ] && [ "$BUILDARCH" = "amd64" ]; then \
35+ dpkg --add-architecture arm64 && \
36+ apt-get update && apt-get install -y --no-install-recommends \
37+ gcc-aarch64-linux-gnu librbd-dev:arm64 librados-dev:arm64 libc6-dev:arm64; \
38+ fi
39+
40+ # Install cross-compiler for AMD64 if building for amd64 on an arm64 host
41+ RUN if [ "$TARGETARCH" = "amd64" ] && [ "$BUILDARCH" = "arm64" ]; then \
42+ apt update && \
43+ apt-get install -y --no-install-recommends \
44+ gcc-x86-64-linux-gnu; \
45+ fi
46+
47+ # Set compiler and linker flags based on target architecture
48+ ENV CC=""
49+ ENV CGO_LDFLAGS=""
50+
51+ RUN if [ "$TARGETARCH" != "$BUILDARCH" ] && [ "$TARGETARCH" = "arm64" ]; then \
52+ export CC="/usr/bin/aarch64-linux-gnu-gcc" ; \
53+ export CGO_LDFLAGS="-L/usr/lib/aarch64-linux-gnu -Wl,-lrados -Wl,-lrbd" ; \
54+ elif [ "$TARGETARCH" != "$BUILDARCH" ] && [ "$TARGETARCH" = "amd64" ]; then \
55+ export CC="/usr/bin/x86_64-linux-gnu-gcc" ; \
56+ export CGO_LDFLAGS="-L/usr/lib/x86_64-linux-gnu -Wl,-lrados -Wl,-lrbd" ; \
57+ else \
58+ export CC="/usr/bin/gcc" ; \
59+ export CGO_LDFLAGS="" ; \
60+ fi && \
61+ CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH \
62+ CC="$CC" CGO_LDFLAGS="$CGO_LDFLAGS" \
63+ go build -ldflags="-s -w -linkmode=external" -o libvirt-provider ./cmd/libvirt-provider/main.go
3264
3365# Install irictl-machine
3466RUN --mount=type=cache,target=/root/.cache/go-build \
3567 --mount=type=cache,target=/go/pkg \
36- CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH GO111MODULE=on go install github.com/ironcore-dev/ironcore/irictl-machine/cmd/irictl-machine@main
68+ CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH GO111MODULE=on \
69+ go install github.com/ironcore-dev/ironcore/irictl-machine/cmd/irictl-machine@main
70+
71+ # Ensure the binary is in a common location
72+ RUN if [ "$TARGETARCH" = "$BUILDARCH" ]; then \
73+ mv /go/bin/irictl-machine /workspace/irictl-machine; \
74+ else \
75+ mv /go/bin/linux_$TARGETARCH/irictl-machine /workspace/irictl-machine; \
76+ fi
3777
3878# Since we're leveraging apt to pull in dependencies, we use `gcr.io/distroless/base` because it includes glibc.
3979FROM gcr.io/distroless/base-debian11 AS distroless-base
@@ -42,12 +82,15 @@ FROM gcr.io/distroless/base-debian11 AS distroless-base
4282FROM distroless-base AS distroless-amd64
4383ENV LIB_DIR_PREFIX=x86_64
4484ENV LIB_DIR_PREFIX_MINUS=x86-64
85+ ENV LIB_DIR_SUFFIX_NUMBER=2
86+ ENV LIB_DIR=lib64
4587
4688# The distroless arm64 image has a target triplet of aarch64
4789FROM distroless-base AS distroless-arm64
4890ENV LIB_DIR_PREFIX=aarch64
4991ENV LIB_DIR_PREFIX_MINUS=aarch64
50-
92+ ENV LIB_DIR_SUFFIX_NUMBER=1
93+ ENV LIB_DIR=lib
5194
5295FROM busybox:1.37.0-uclibc AS busybox
5396FROM distroless-$TARGETARCH AS libvirt-provider
@@ -84,14 +127,14 @@ COPY --from=builder /lib/${LIB_DIR_PREFIX}-linux-gnu/librados.so.2 \
84127/lib/${LIB_DIR_PREFIX}-linux-gnu/libselinux.so.1 \
85128/lib/${LIB_DIR_PREFIX}-linux-gnu/libpthread.so.0 \
86129/lib/${LIB_DIR_PREFIX}-linux-gnu/libpcre2-8.so.0 /lib/${LIB_DIR_PREFIX}-linux-gnu/
87- RUN mkdir -p /lib64
88- COPY --from=builder /lib64 /ld-linux-${LIB_DIR_PREFIX_MINUS}.so.2 /lib64 /
130+ RUN mkdir -p /${LIB_DIR}
131+ COPY --from=builder /${LIB_DIR} /ld-linux-${LIB_DIR_PREFIX_MINUS}.so.${LIB_DIR_SUFFIX_NUMBER} /${LIB_DIR} /
89132RUN mkdir -p /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/ceph/
90133COPY --from=builder /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/ceph/libceph-common.so.2 /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/ceph
91134COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
92135
93136COPY --from=builder /workspace/libvirt-provider /libvirt-provider
94- COPY --from=builder /go/bin /irictl-machine /irictl-machine
137+ COPY --from=builder /workspace /irictl-machine /irictl-machine
95138
96139USER 65532:65532
97140
0 commit comments