From: Art Cancro Date: Thu, 1 Dec 2022 07:00:50 +0000 (-0500) Subject: Switched to a multi stage build for a significantly smaller container image. X-Git-Url: https://code.citadel.org/?p=citadel-docker.git;a=commitdiff_plain;h=82d173f1930bf03d055b83d0a9079ff667590022 Switched to a multi stage build for a significantly smaller container image. --- diff --git a/Dockerfile b/Dockerfile index 87aaeaf..1426950 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,11 @@ # Dockerfile for Citadel -# Originally we built on MiniDeb, a stripped down version of Debian for use in containers. -# Now it's on Debian Slim because we want to build on i386 and arm32. -FROM debian:stable-slim +# Debian Slim has all of the architectures we build on (amd64, i386, arm32) +# The first stage build will bring in all of our development tools. +FROM debian:bullseye-slim AS build-stage + +# The "branch" argument specifies the branch or tag from which we will build. +ARG branch=master # All long term persistent data goes here. Any volume driver may be used. VOLUME /citadel-data @@ -12,11 +15,12 @@ RUN apt -y update RUN apt -y install gcc bison make zlib1g-dev libldap2-dev libssl-dev gettext libical-dev libexpat1-dev curl libcurl4-openssl-dev git autoconf automake netbase libreadline-dev # Build our own local copy of Berkeley DB, because the one included with the system libs is too old. +# For the container ... we're going to do static binaries because disk is cheap and the Gotards are doing it this way now too. RUN sh -c 'mkdir /tmp/db_build && \ cd /tmp/db_build && \ curl -k https://easyinstall.citadel.org/db-6.2.32.NC.tar.gz | tar xvzf - && \ cd db-6.2.32.NC/build_unix && \ - ../dist/configure --prefix=/usr/local/ctdlsupport --disable-compat185 --disable-cxx --disable-debug --disable-dump185 --disable-java --disable-tcl --disable-test --without-rpm && \ + ../dist/configure --prefix=/usr/local --disable-static --disable-compat185 --disable-cxx --disable-debug --disable-dump185 --disable-java --disable-tcl --disable-test --without-rpm && \ make && \ make install && \ cd /tmp && \ @@ -27,46 +31,74 @@ RUN mkdir /tmp/ctdl_build # Deploy "ctdlvisor", a small supervisor program which runs inside the container to wrangle the various services ADD ctdlvisor.c /tmp +RUN sh -c '\ + cd /tmp && \ + cc ctdlvisor.c -o /usr/local/bin/ctdlvisor && \ + rm -vf /tmp/ctdlvisor.c' -# Burn the cache if the upstream repository has changed -ADD "https://easyinstall.citadel.org/libcitadel-easyinstall.tar.gz" /tmp/ctdl_build -ADD "https://easyinstall.citadel.org/citadel-easyinstall.tar.gz" /tmp/ctdl_build -ADD "https://easyinstall.citadel.org/webcit-easyinstall.tar.gz" /tmp/ctdl_build -ADD "https://easyinstall.citadel.org/textclient-easyinstall.tar.gz" /tmp/ctdl_build - -# Download and build Citadel -RUN sh -c 'export CFLAGS=-I/usr/local/ctdlsupport/include && \ - export LDFLAGS="-L/usr/local/ctdlsupport/lib -Wl,--rpath -Wl,/usr/local/ctdlsupport/lib" && \ +# Grab the repository at the specified branch or tag. If there wasn't any change we should enjoy the cache. +RUN sh -c '\ cd /tmp/ctdl_build && \ - tar xvzf libcitadel-easyinstall.tar.gz && \ - tar xvzf citadel-easyinstall.tar.gz && \ - tar xvzf webcit-easyinstall.tar.gz && \ - tar xvzf textclient-easyinstall.tar.gz && \ - cd /tmp/ctdl_build/libcitadel && \ - ./configure --prefix=/usr && \ + git clone -b $branch --single-branch git://git.citadel.org/citadel' + +# Build libcitadel +RUN sh -c '\ + cd /tmp/ctdl_build/citadel/libcitadel && \ + ./bootstrap && \ + ./configure --prefix=/usr/local && \ make && \ - make install && \ - cd /tmp/ctdl_build/citadel && \ + make install' + +# Build the Citadel Server +RUN sh -c '\ + export CFLAGS=-I/usr/local/include && \ + export LDFLAGS=-L/usr/local/lib && \ + cd /tmp/ctdl_build/citadel/citadel && \ + ./bootstrap && \ ./configure && \ make && \ - make install && \ - cd /tmp/ctdl_build/webcit && \ + make install' + +# Build the WebCit front end +RUN sh -c '\ + export CFLAGS=-I/usr/local/include && \ + export LDFLAGS=-L/usr/local/lib && \ + cd /tmp/ctdl_build/citadel/webcit && \ + ./bootstrap && \ ./configure && \ make && \ - make install && \ - cd /tmp/ctdl_build/textclient && \ - ./bootstrap && \ + make install' + +# Build the text mode client +RUN sh -c '\ + export CFLAGS=-I/usr/local/include && \ + export LDFLAGS=-L/usr/local/lib && \ + cd /tmp/ctdl_build/citadel/textclient && \ ./configure --prefix=/usr --ctdldir=/citadel_data && \ make && make install && \ cd /tmp && \ - cc ctdlvisor.c -o /usr/local/bin/ctdlvisor && \ - rm -vf /tmp/ctdlvisor.c && \ - cd /tmp && \ rm -vfr /tmp/ctdl_build && \ rm -vrf /usr/local/citadel/data /usr/local/citadel/files /usr/local/citadel/keys /usr/local/webcit/keys' +#################################################################################################### + +# Second stage build is runtime only. +FROM debian:bullseye-slim AS final-stage + +# All long term persistent data goes here. Any volume driver may be used. +VOLUME /citadel-data + +# Install prerequisites +RUN apt -y update +RUN apt -y install zlib1g libical3 libexpat1 curl libcurl4 netbase libreadline8 libldap-2.4-2 libssl1.1 + +# Bring in Citadel and libraries +COPY --from=build-stage /usr/local/ /usr/local/ +RUN ldconfig -v + # Ports EXPOSE 25 80 110 119 143 443 465 504 563 587 993 995 2020 5222 # Let's go! ENTRYPOINT ["/usr/local/bin/ctdlvisor"] +