From fab17b98c657a0edba5bcd7aafb714b3c27a052c Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Wed, 17 Mar 2021 19:31:08 -0500 Subject: [PATCH] Make pip install faster for Complement testing Install dependencies before we copy over the whole project so that any change we make to the project source while developing does not invalidate the Docker layer cache where we installed all of the dependencies. This speeds up Docker rebuilds by a lot! --- changelog.d/9610.docker | 1 + docker/Dockerfile | 42 ++++++++++++++++++++--------------------- 2 files changed, 21 insertions(+), 22 deletions(-) create mode 100644 changelog.d/9610.docker diff --git a/changelog.d/9610.docker b/changelog.d/9610.docker new file mode 100644 index 000000000000..056252a66963 --- /dev/null +++ b/changelog.d/9610.docker @@ -0,0 +1 @@ +Speed up Docker builds and make it nicer to test against Complement while developing (install all dependencies before copying the project). diff --git a/docker/Dockerfile b/docker/Dockerfile index def4501541fe..3b3bf403d54b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -30,31 +30,29 @@ RUN apt-get update && apt-get install -y \ libxslt1-dev \ rustc \ zlib1g-dev \ - && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* -# Build dependencies that are not available as wheels, to speed up rebuilds -RUN pip install --prefix="/install" --no-warn-script-location \ - cryptography \ - frozendict \ - jaeger-client \ - opentracing \ - # Match the version constraints of Synapse - "prometheus_client>=0.4.0" \ - psycopg2 \ - pycparser \ - pyrsistent \ - pyyaml \ - simplejson \ - threadloop \ - thrift - -# now install synapse and all of the python deps to /install. -COPY synapse /synapse/synapse/ +# Copy just what we need to pip install COPY scripts /synapse/scripts/ COPY MANIFEST.in README.rst setup.py synctl /synapse/ +COPY synapse/__init__.py /synapse/synapse/__init__.py +COPY synapse/python_dependencies.py /synapse/synapse/python_dependencies.py +# To speed up rebuilds, install all of the dependencies before we copy over +# the whole synapse project so that we this layer in the Docker cache can be +# used while you develop on the source +# +# This is aiming at installing the `install_requires` and `extras_require` from `setup.py` RUN pip install --prefix="/install" --no-warn-script-location \ - /synapse[all] + /synapse[all] + +# Copy over the rest of the project +COPY synapse /synapse/synapse/ + +# Install the synapse package itself and all of its children packages. +# +# This is aiming at installing only the `packages=find_packages(...)` from `setup.py +RUN pip install --prefix="/install" --no-deps --no-warn-script-location /synapse ### ### Stage 1: runtime @@ -70,7 +68,7 @@ RUN apt-get update && apt-get install -y \ libwebp6 \ xmlsec1 \ libjemalloc2 \ - && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* COPY --from=builder /install /usr/local COPY ./docker/start.py /start.py @@ -83,4 +81,4 @@ EXPOSE 8008/tcp 8009/tcp 8448/tcp ENTRYPOINT ["/start.py"] HEALTHCHECK --interval=1m --timeout=5s \ - CMD curl -fSs http://localhost:8008/health || exit 1 + CMD curl -fSs http://localhost:8008/health || exit 1