# A dockerfile which builds a docker image for building a debian package for # synapse. The distro to build for is passed as a docker build var. # # The default entrypoint expects the synapse source to be mounted as a # (read-only) volume at /synapse/source, and an output directory at /debs. # # A pair of environment variables (TARGET_USERID and TARGET_GROUPID) can be # passed to the docker container; if these are set, the build script will chown # the build products accordingly, to avoid ending up with things owned by root # in the host filesystem. # Get the distro we want to pull from as a dynamic build variable ARG distro="" ### ### Stage 0: build a dh-virtualenv ### # This is only really needed on focal, since other distributions we # care about have a recent version of dh-virtualenv by default. Unfortunately, # it looks like focal is going to be with us for a while. # # (focal doesn't have a dh-virtualenv package at all. There is a PPA at # https://launchpad.net/~jyrki-pulliainen/+archive/ubuntu/dh-virtualenv, but # it's not obviously easier to use that than to build our own.) FROM ${distro} as builder RUN apt-get update -qq -o Acquire::Languages=none RUN env DEBIAN_FRONTEND=noninteractive apt-get install \ -yqq --no-install-recommends \ build-essential \ ca-certificates \ devscripts \ equivs \ wget # fetch and unpack the package RUN mkdir /dh-virtualenv RUN wget -q -O /dh-virtualenv.tar.gz https://github.com/spotify/dh-virtualenv/archive/refs/tags/1.2.2.tar.gz RUN tar -xv --strip-components=1 -C /dh-virtualenv -f /dh-virtualenv.tar.gz # install its build deps. We do another apt-cache-update here, because we might # be using a stale cache from docker build. RUN apt-get update -qq -o Acquire::Languages=none \ && cd /dh-virtualenv \ && env DEBIAN_FRONTEND=noninteractive mk-build-deps -ri -t "apt-get -y --no-install-recommends" # Build it. Note that building the docs doesn't work due to differences in # Sphinx APIs across versions/distros. RUN cd /dh-virtualenv && DEB_BUILD_OPTIONS=nodoc dpkg-buildpackage -us -uc -b ### ### Stage 1 ### FROM ${distro} # Get the distro we want to pull from as a dynamic build variable # (We need to define it in each build stage) ARG distro="" ENV distro ${distro} # Python < 3.7 assumes LANG="C" means ASCII-only and throws on printing unicode # http://bugs.python.org/issue19846 ENV LANG C.UTF-8 # Install the build dependencies # # NB: keep this list in sync with the list of build-deps in debian/control # TODO: it would be nice to do that automatically. RUN apt-get update -qq -o Acquire::Languages=none \ && env DEBIAN_FRONTEND=noninteractive apt-get install \ -yqq --no-install-recommends -o Dpkg::Options::=--force-unsafe-io \ build-essential \ curl \ debhelper \ devscripts \ libsystemd-dev \ lsb-release \ pkg-config \ python3-dev \ python3-pip \ python3-setuptools \ python3-venv \ sqlite3 \ libpq-dev \ xmlsec1 # Install rust and ensure it's in the PATH ENV RUSTUP_HOME=/rust ENV CARGO_HOME=/cargo ENV PATH=/cargo/bin:/rust/bin:$PATH RUN mkdir /rust /cargo RUN curl -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --default-toolchain stable COPY --from=builder /dh-virtualenv_1.2.2-1_all.deb / # install dhvirtualenv. Update the apt cache again first, in case we got a # cached cache from docker the first time. RUN apt-get update -qq -o Acquire::Languages=none \ && apt-get install -yq /dh-virtualenv_1.2.2-1_all.deb WORKDIR /synapse/source ENTRYPOINT ["bash","/synapse/source/docker/build_debian.sh"]