1+ # Stage 1: Build Go binary
12FROM golang:1.23 as builder
23
34ARG REPOPATH=$GOPATH/src/github.com/F5Networks/k8s-bigip-ctlr
@@ -8,15 +9,27 @@ ARG BUILD_INFO
89
910WORKDIR $REPOPATH
1011ENV GO111MODULE on
12+
1113COPY . .
1214
1315RUN $REPOPATH/build-tools/rel-build.sh
1416
17+ # Stage 2: Build expat RPM (not from source!)
18+ FROM registry.redhat.io/ubi9/ubi-minimal AS build-expat-rpm
19+
20+ RUN microdnf install -y rpm-build gcc gcc-c++ make tar bzip2 python3 shadow-utils autoconf libtool && microdnf clean all
21+ WORKDIR /root
22+ RUN mkdir -p /root/rpmbuild/{SOURCES,SPECS,BUILD,BUILDROOT,RPMS,SRPMS}
23+ COPY build-tools/expat.spec /root/rpmbuild/SPECS/expat.spec
24+ RUN curl -L -o /root/rpmbuild/SOURCES/expat-2.7.2.tar.gz https://github.com/libexpat/libexpat/releases/download/R_2_7_2/expat-2.7.2.tar.gz
25+ WORKDIR /root/rpmbuild
26+ RUN rpmbuild -ba SPECS/expat.spec
27+
28+ # Stage 3: Final runtime image
1529FROM registry.redhat.io/ubi9/ubi-minimal
1630
1731LABEL name="f5networks/k8s-bigip-ctlr" \
1832 vendor="F5 Networks" \
19- # version - should be passed in via docker build
2033 url="https://clouddocs.f5.com/containers/latest/" \
2134 summary="F5 BIG-IP Controller for Kubernetes" \
2235 description="Manages F5 BIG-IP from Kubernetes" \
@@ -27,17 +40,22 @@ LABEL name="f5networks/k8s-bigip-ctlr" \
2740 io.openshift.tags="f5,f5networks,bigip,openshift,router"
2841
2942ENV APPPATH /app
30-
3143ARG BUILD_VERSION
3244ARG BUILD_INFO
33-
3445WORKDIR $APPPATH
3546
47+ # Install expat 2.7.2 RPM first!
48+ COPY --from=build-expat-rpm /root/rpmbuild/RPMS/x86_64/expat-2.7.2-*.rpm /tmp/
49+ RUN microdnf remove expat -y || true && \
50+ rpm -Uvh /tmp/expat-2.7.2-*.rpm && \
51+ microdnf clean all
52+
3653COPY requirements.txt /tmp/requirements.txt
3754
3855RUN mkdir -p "$APPPATH/bin" "$APPPATH/vendor/src/f5/schemas/" \
3956 && touch $APPPATH/vendor/src/f5/VERSION_BUILD.json
4057
58+ # Install runtime dependencies
4159RUN microdnf update -y && \
4260 microdnf --enablerepo=ubi-9-baseos-rpms install --nodocs python39 python3-pip git shadow-utils -y && \
4361 microdnf --enablerepo=ubi-9-baseos-rpms --enablerepo=ubi-9-appstream-rpms update nss-tools nss-softokn nss-util scl-utils -y && \
@@ -49,10 +67,12 @@ RUN microdnf update -y && \
4967 microdnf remove perl-Error perl-File-Find perl-lib libedit openssh openssh-clients perl-TermReadKey git-core git-core-doc less shadow-utils pip git-core-doc cracklib cracklib-dicts emacs-filesystem git-core-doc git-core groff-base gzip less libcbor libdb libeconf libedit libfdisk util-linux util-linux-core libfido2 libpwquality libsemanage libutempter ncurses openssh openssh-clients openssh-8.7p1 pam perl-Digest perl-Digest-MD5 perl-FileHandle perl-B perl-Data-Dumper perl-libnet perl-base perl-AutoLoader perl-URI perl-Mozilla-CA perl-if perl-IO-Socket-IP perl-Time-Local perl-File-Path perl-Pod-Escapes perl-Text-Tabs+Wrap perl-Net-SSLeay perl-IO-Socket-SSL perl-Class-Struct perl-POSIX perl-Term-ANSIColor perl-IPC-Open3 perl-subs perl-File-Temp perl-Term-Cap perl-HTTP-Tiny perl-Pod-Simple perl-Socket perl-SelectSaver perl-Symbol perl-File-stat perl-podlators perl-Pod-Perldoc perl-Fcntl perl-Text-ParseWords perl-mro perl-IO perl-overloading perl-Pod-Usage perl-Errno perl-File-Basename perl-Getopt-Std perl-MIME-Base64 perl-Scalar-List-Utils perl-constant perl-Storable perl-overload perl-parent perl-vars perl-Getopt-Long perl-Carp perl-Exporter perl-NDBM_File perl-PathTools perl-Encode perl-libs perl-interpreter perl-DynaLoader -y && \
5068 microdnf clean all && echo "{\"version\": \"${BUILD_VERSION}\", \"build\": \"${BUILD_INFO}\"}" > $APPPATH/vendor/src/f5/VERSION_BUILD.json && chown -R ctlr "$APPPATH" && chmod -R 755 "$APPPATH"
5169
52- # Remove shell access
70+ # Remove shell access for security
5371RUN rm -f /bin/sh /bin/bash
5472
73+ # Switch to non-root user
5574USER ctlr
75+
5676COPY schemas/*.json $APPPATH/vendor/src/f5/schemas/
5777COPY LICENSE /licenses/
5878
0 commit comments