From f94426476dcba1f2076004f4a142f6773046159c Mon Sep 17 00:00:00 2001 From: Sylvain Tricot Date: Thu, 27 Oct 2022 16:06:51 +0200 Subject: [PATCH] Add multistage build To reduce the size of the Docker image. We use a multistage build based on an alpine distro, the size is reduced by a factor of 7. --- Dockerfile | 106 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 92 insertions(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6c3feba..51a63e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,24 +1,102 @@ # Get the base Python image -FROM python:latest +FROM alpine:edge AS builder + +# Variables +ARG branch="devel" +ARG login="" password="" +ARG folder=/opt/msspec user=msspec # Install system dependencies -RUN apt-get update && apt-get install -y virtualenv gfortran libgtk-3-dev nano - -# Add a non-privileged user -RUN useradd -ms /bin/bash -d /opt/msspec msspec - -# Set the working directory in the container -USER msspec -RUN mkdir -p /opt/msspec/code -WORKDIR /opt/msspec/code +# tools +RUN apk add bash git make gfortran python3 +# headers +RUN apk add python3-dev lapack-dev musl-dev +# python packages +RUN apk add py3-virtualenv py3-pip py3-numpy-dev py3-h5py py3-lxml py3-matplotlib py3-numpy py3-pandas py3-cairo py3-scipy py3-setuptools_scm +RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing py3-wxpython +RUN pip install ase pint terminaltables ipython +# for GUI +RUN apk add ttf-droid adwaita-icon-theme +RUN apk add build-base # Fetch the code -RUN git clone https://git.ipr.univ-rennes1.fr/epsi/msspec_python3.git . -#COPY --chown=msspec:msspec . . +RUN mkdir -p ${folder}/code +WORKDIR ${folder}/code +RUN git clone --branch ${branch} https://${login}:${password}@git.ipr.univ-rennes1.fr/epsi/msspec_python3.git . +# Build +RUN make pybinding NO_VENV=1 PYTHON=python3 VERBOSE=1 +RUN make -C src sdist PYTHON=python3 NO_VENV=1 VENV_PATH=${folder}/.local/src/msspec_venv && \ + pip install src/dist/msspec*tar.gz + +# Add a non-privileged user +RUN adduser -D -s /bin/bash -h ${folder} ${user} + +# Set the working directory in the container +USER ${user} + +RUN virtualenv --system-site-packages ${folder}/.local/src/msspec_venv +RUN make -C src frontend PYTHON=python3 NO_VENV=1 VENV_PATH=${folder}/.local/src/msspec_venv + + + +FROM alpine:edge +# Variables +ARG folder=/opt/msspec user=msspec +# Install system dependencies +RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing \ +# hdf5-hl cairo openblas lapack libxml2 libxslt libzlf wxwidgets-gtk3 openjpeg libimagequant \ + nano \ + py3-virtualenv \ + lapack \ + bash \ +# git \ +# make \ +# gfortran \ + python3 \ +# ttf-droid \ + ttf-liberation \ + adwaita-xfce-icon-theme \ +# python3-dev \ +# lapack-dev \ +# musl-dev \ +# py3-virtualenv \ + py3-pip \ +# py3-numpy-dev \ + py3-h5py \ + py3-lxml \ + py3-matplotlib \ + py3-numpy \ + py3-pandas \ + py3-cairo \ + py3-scipy \ + py3-setuptools_scm \ + py3-wxpython \ + && pip install \ + ase \ + pint \ + terminaltables \ + ipython \ + && pip cache purge \ + # Add a non-privileged user + && adduser -D -s /bin/bash -h ${folder} ${user} + +# Set the working directory in the container +USER ${user} +WORKDIR ${folder} # Install msspec -ENV PATH=/opt/msspec/.local/bin:$PATH -RUN make install VERBOSE=1 +#COPY --from=builder ${folder}/.local ${folder}/.local +#COPY --from=builder /usr/lib/python3.10/site-packages /usr/lib/python3.10/site-packages + +COPY --from=builder ${folder}/code/src/dist/msspec*tar.gz msspec.tar.gz +RUN virtualenv --system-site-packages .local/src/msspec_venv && \ + . .local/src/msspec_venv/bin/activate && \ + pip install msspec.tar.gz && \ + rm -f msspec.tar.gz && \ + mkdir -p .local/bin + +COPY --from=builder ${folder}/.local/bin/msspec .local/bin/msspec +ENV PATH=${folder}/.local/bin:$PATH # Run the msspec frontend command on startup ENTRYPOINT ["msspec"]