From cbc86e6fe88e383520556c935503efd2448587bf Mon Sep 17 00:00:00 2001 From: Taka Date: Fri, 3 Dec 2021 19:40:38 +1100 Subject: [PATCH] Tightened up the Docker build. --- Dockerfile | 76 +++++++++++++++++++----------------------------------- 1 file changed, 27 insertions(+), 49 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9603bd4..1024a6c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,57 +1,14 @@ # NOTE: Use the run-container.sh script to build and launch this container. -# We do a multi-stage build (requires Docker >= 17.05) to install everything, then copy it all -# to the final target image. - +# NOTE: Multi-stage builds require Docker >= 17.05. FROM centos:8 AS base -# update packages -RUN dnf -y upgrade-minimal - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# NOTE: We install the Python dependencies into a temporary intermediate stage, then copy everything over -# to the final image, because some modules (e.g. grpcio) need pre-requisites to be installed. -# This saves us about 300 MB for the final image and, importantly, adding a requirement doesn't cause us -# to re-install Java and Firefox below, when we start building the final image. - -FROM base AS build - -# install Python -# NOTE: The version of Python we want is newer than what's in Centos 8, -# so we have to install from source :-/ -RUN dnf -y groupinstall "Development Tools" && \ - dnf -y install openssl-devel bzip2-devel libffi-devel sqlite-devel -RUN cd /tmp && \ - dnf -y install wget && \ - wget https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tgz && \ - tar xvf Python-3.8.7.tgz && \ - cd Python-3.8.7/ && \ - ./configure --enable-optimizations && \ - make install - -# set up a virtualenv -RUN python3 -m venv /opt/venv -ENV PATH="/opt/venv/bin:$PATH" - -# install the application requirements -COPY requirements.txt requirements-dev.txt ./ -RUN pip3 install -r requirements.txt -ARG CONTROL_TESTS_PORT -RUN if [ -n "$CONTROL_TESTS_PORT" ]; then \ - dnf install -y gcc-c++ python3-devel && \ - pip3 install -r requirements-dev.txt \ -; fi - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -FROM base +# update packages and install requirements +RUN dnf -y upgrade-minimal && \ + dnf install -y python38 -# copy the Python installation from the build image -COPY --from=build /usr/local/bin/python3.8 /usr/local/bin/python3.8 -COPY --from=build /usr/local/lib/python3.8 /usr/local/lib/python3.8 -COPY --from=build /usr/local/bin/pip3 /usr/local/bin/pip3 -RUN ln -s /usr/local/bin/python3.8 /usr/local/bin/python3 +# NOTE: We don't need the following stuff for the build step, but it's nice to not have to re-install +# it all every time we change the requirements :-/ # install Java RUN url="https://download.java.net/java/GA/jdk15.0.1/51f4f36ad4ef43e39d0dfdbaf6549e32/9/GPL/openjdk-15.0.1_linux-x64_bin.tar.gz" ; \ @@ -71,7 +28,28 @@ RUN url=$( curl -s https://api.github.com/repos/mozilla/geckodriver/releases/lat # clean up RUN dnf clean all +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +FROM base AS build + +# set up a virtualenv +RUN python3 -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" +RUN pip install --upgrade pip + # install the application requirements +COPY requirements.txt requirements-dev.txt /tmp/ +RUN pip3 install -r /tmp/requirements.txt +ARG CONTROL_TESTS_PORT +RUN if [ -n "$CONTROL_TESTS_PORT" ]; then \ + pip3 install -r /tmp/requirements-dev.txt \ +; fi + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +FROM base + +# copy the virtualenv from the build image COPY --from=build /opt/venv /opt/venv ENV PATH="/opt/venv/bin:$PATH"