
#
# This Dockerfile allows copying only the ParaView install tree from the
# development image.  To be sure the resulting paraview binaries work, you
# must still use, as the second-stage base image, the same base image used
# to build the development image.
#
# To build this image:
#
#     $ docker build \
#         --build-arg PV_DEV_BASE_IMAGE=pv-v5.7.1-egl-py3-dev \
#         -t pv-v5.7.1-egl-py3-rel \
#         .
#
# To customize the image used as the second-stage base, use the `BASE_IMAGE`
# build argument:
#
#     $ docker build \
#         --build-arg PV_DEV_BASE_IMAGE=pv-v5.7.1-egl-py3-dev \
#         --build-arg BASE_IMAGE=nvidia/opengl:1.0-glvnd-devel-ubuntu18.04 \
#         -t pv-v5.7.1-egl-py3-rel \
#         .
#

FROM paraview:5.8-devel-py3-egl AS devimage
FROM nvidia/cudagl:10.1-runtime-ubuntu18.04 AS baseimage

# Now install python the same same way we did in the base
ARG PYTHON_VERSION=2

# The following environment variables help with the Python 2 vs 3 option while
# we still support both of them.  In order for this approach to work, we need
# the RUN command to use bash instead of sh for variable indirection.
SHELL ["/bin/bash", "-c"]

ENV SYSTEM_PYTHON_2_PIP pip
ENV SYSTEM_PYTHON_3_PIP pip3
ENV SYSTEM_PYTHON_PIP "SYSTEM_PYTHON_${PYTHON_VERSION}_PIP"

RUN apt-get update && \
    apt install -y --no-install-recommends \
    numactl \
    librdmacm1 \
    libpmi2-0 \
    openssh-client \
    libgomp1 && \
    if [ "${PYTHON_VERSION}" = "2" ]; then apt-get install -y --no-install-recommends python2.7-dev python-pip python-setuptools; fi && \
    if [ "${PYTHON_VERSION}" = "3" ]; then apt-get install -y --no-install-recommends python3-dev python3-pip python3-setuptools; fi && \
    if [ "${PYTHON_VERSION}" = "3" ]; then update-alternatives --install /usr/bin/python python /usr/bin/python3 1; fi && \
    rm -rf /var/lib/apt/lists/*

# Re-create the non-root user we had in development image
RUN groupadd pv-user && \
    useradd -g pv-user -d /home/pv-user pv-user && \
    mkdir /home/pv-user && chown -R pv-user:pv-user /home/pv-user

COPY --from=devimage /usr/lib/i386-linux-gnu/libOpenGL.so /usr/lib/i386-linux-gnu/
COPY --from=devimage /usr/lib/x86_64-linux-gnu/libOpenGL.so /usr/lib/x86_64-linux-gnu/
RUN ln -s /usr/lib/i386-linux-gnu/libOpenGL.so /usr/lib/i386-linux-gnu/libOpenGL.so.0 \
 && ln -s /usr/lib/i386-linux-gnu/libOpenGL.so /usr/lib/i386-linux-gnu/libOpenGL.so.0.0 \
 && ln -s /usr/lib/x86_64-linux-gnu/libOpenGL.so /usr/lib/x86_64-linux-gnu/libOpenGL.so.0 \
 && ln -s /usr/lib/x86_64-linux-gnu/libOpenGL.so /usr/lib/x86_64-linux-gnu/libOpenGL.so.0.0

# Copy the installed MPI build from the devimage
ENV UCX_WARN_UNUSED_ENV_VARS=no \
    OMPI_MCA_pml=ucx \
    OMPI_MCA_btl=^openib \
    NVINDEX_PVPLUGIN_HOME=/usr/local/paraview/config \
    PATH=${PATH:+${PATH}:}/usr/local/openmpi/bin:/usr/local/paraview/bin \
    LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}/usr/local/openmpi/lib:/usr/local/paraview/lib:/usr/local/xpmem/lib:/usr/local/ucx/lib \
    PKG_CONFIG_PATH=/usr/local/ucx/lib/pkgconfig:/usr/local/openmpi/lib/pkgconfig:/usr/local/xpmem/lib/pkgconfig
COPY --from=devimage /usr/local/xpmem/lib /usr/local/xpmem/lib
COPY --from=devimage /usr/local/ucx/bin /usr/local/ucx/bin
COPY --from=devimage /usr/local/ucx/lib /usr/local/ucx/lib
COPY --from=devimage /usr/local/openmpi/bin /usr/local/openmpi/bin
COPY --from=devimage /usr/local/openmpi/share /usr/local/openmpi/share
COPY --from=devimage /usr/local/openmpi/lib /usr/local/openmpi/lib
COPY --from=devimage /usr/local/cuda/lib64/libnvrtc.so /usr/local/cuda/lib64/libnvrtc.so
COPY --from=devimage /etc/ld.so.conf.d/nvidia.conf /etc/ld.so.conf.d/nvidia.conf
RUN ldconfig

# Now copy the installed paraview from the development image, using
# the non-root user as the owner.
COPY --from=devimage --chown=pv-user:pv-user /opt/paraview /opt/paraview

# Add ParaView's library directory to the library path
ENV LD_LIBRARY_PATH=/opt/paraview/lib:${LD_LIBRARY_PATH}

# Set the IndeX plugin to auto-load
RUN sed -i 's/"pvNVIDIAIndeX" auto_load="0"/"pvNVIDIAIndeX" auto_load="1"/g' /opt/paraview/lib/paraview-5.8/plugins/paraview.plugins.xml

USER pv-user
WORKDIR /opt/paraview
