Skip to content

Commit

Permalink
Use MASSpy github docker file
Browse files Browse the repository at this point in the history
gchhughes authored Jan 8, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent b5ed9e6 commit 4baa2b6
Showing 1 changed file with 171 additions and 11 deletions.
182 changes: 171 additions & 11 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,16 +1,176 @@
FROM ghcr.io/ucsd-ets/datascience-notebook:stable
ARG python_version=3.7
ARG mass_version=0.1.7
# Image to checkout and install a specific version of MASSpy
FROM python:${python_version} AS env-setup
ARG python_version
ARG mass_version

LABEL maintainer="UC San Diego ITS/ETS <[email protected]>"
# Define build arguments
# User information
ARG user=mass_user
ARG group=mass_group
ARG project=mass_project
ARG uid=1000
ARG gid=1000
# Verbosity of dockerfile output when possible
ARG verbose

USER root
# User environment variables
ENV USER=${user} \
GROUP=${group} \
UID=${uid} \
GID=${gid} \
HOME=/home/${user} \
PROJECT_VOLUME=/${project}

RUN apt-get update && \
apt-get -y install software-properties-common && \
add-apt-repository -y universe && \
apt-get -y install libncurses5-dev libncursesw5-dev libncurses5
# MASSpy environment variable, allow version to be changed at time of build
ENV MASS_VERSION=${mass_version}
ENV MASS_INSTALL /opt/MASSpy
ENV LICENSE_DIR /opt/licenses
# Verbosity of image build and entrypoint script
ENV VERBOSE=${verbose:-0}

RUN pip install python==3.8
RUN pip install --upgrade numpy==1.13
RUN pip install --no-cache-dir masspy==0.1.7
RUN [ ${VERBOSE} -ne 0 ] \
&& echo 'Building image using the following:\n' \
&& echo 'PYTHON_VERSION '${PYTHON_VERSION} \
&& echo 'MASS_VERSION: '${MASS_VERSION} \
&& echo 'USER (UID): '${USER}' ('${UID}')' \
&& echo 'GROUP (GID): '${GROUP}' ('${GID}')' \
&& echo 'PROJECT_VOLUME: '${HOME}${PROJECT_VOLUME} \
|| :

USER jovyan
# CPLEX environment variables
ENV CPLEX_VERSION 12.10.0
ENV CPLEX_INSTALL /opt/CPLEX
ENV CPLEX_HOME ${CPLEX_INSTALL}/cplex/python/$python_version/x86-64_linux

# Gurobi environment variables
ENV GUROBI_VERSION 9.0.3
ENV GUROBI_INSTALL /opt/gurobi
ENV GUROBI_HOME ${GUROBI_INSTALL}/linux64
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HOME}${GUROBI_HOME}/lib

FROM env-setup AS mass-setup
# # Copy build context files into tmp
WORKDIR ${HOME}/tmp/MASSpy
COPY ./ ./

# Make directory for MASSpy installation
WORKDIR ${HOME}/opt
RUN echo \
&& if [ "${MASS_VERSION}" != "local" ] ; then \
git clone https://github.com/SBRG/MASSpy.git $( [ ${VERBOSE} -eq 0 ] && echo '--quiet' ) \
&& dirpath=../tmp/MASSpy ; \
else \
# Copy local MASSpy files to expected install path
cp -R ../tmp/MASSpy/ ${HOME}/opt/ \
&& dirpath=../tmp/MASSpy/docker ; \
fi \
# Make directory for licenses volume and move license files into it
&& mkdir ..${LICENSE_DIR} \
# Copy license files into license directory
&& if [ -e $dirpath/**/*.lic ] ; then mv $dirpath/**/*.lic ..${LICENSE_DIR}/ ; fi

# Checkout a specific version of MASSpy if desired and install
WORKDIR ${HOME}${MASS_INSTALL}
RUN echo \
# If a local version of MASSpy, do nothing with branch checkouts
&& if [ "${MASS_VERSION}" != "local" ] ; then \
# Determine version of MASSpy to checkout from from VCS
if echo ${MASS_VERSION} | grep -Eq '^(latest|main)$' ; then \
# Use latest (main) branch
git checkout main $( [ ${VERBOSE} -eq 0 ] && echo '--quiet' ) ; \
else \
# Assume SemVer given otherwise
git checkout v${MASS_VERSION} $( [ ${VERBOSE} -eq 0 ] && echo '--quiet' ) ; \
fi \
&& pip install . $( [ ${VERBOSE} -eq 0 ] && echo '--quiet' ) ; \
else \
pip install -e . $( [ ${VERBOSE} -eq 0 ] && echo '--quiet' ) ; \
fi \
&& pip install notebook $( [ ${VERBOSE} -eq 0 ] && echo '--quiet' )

# Install IBM CPLEX Optimization Studio if install.bin file present in build context
WORKDIR ${HOME}
RUN echo \
&& cplex_installer=cplex_studio*.linux*.bin \
&& if [ -f $dirpath/cplex/$cplex_installer ] ; then \
if [ ${VERBOSE} -ne 0 ] ; then echo "Installing CPLEX" ; fi \
&& chmod a+rwx $dirpath/cplex/$cplex_installer \
&& $dirpath/cplex/$cplex_installer \
-f ./cplex.installer.properties \
-DUSER_INSTALL_DIR=${HOME}${CPLEX_INSTALL} \
# Copy CPLEX license into license directory
&& mkdir .${LICENSE_DIR}/CPLEX \
&& mv .${CPLEX_INSTALL}/license/*.txt .${LICENSE_DIR}/CPLEX/ \
# Clean files that aren't needed
&& for to_clean in 'concert' 'cpoptimizer' 'doc' 'license' 'opl' 'python' 'Uninstall' ; \
do rm -rf .${CPLEX_INSTALL}/$to_clean ; \
done \
&& for to_clean in 'examples' 'matlab' 'readmeUNIX.html' ; \
do rm -rf .${CPLEX_INSTALL}/cplex/$to_clean ; \
done ; \
else \
if [ ${VERBOSE} -ne 0 ] ; then echo "No installer found for CPLEX" ; fi \
fi

# Install Gurobi Optimizer if gurobi.lic present
WORKDIR ${HOME}
RUN echo \
# Only build if gurobi.lic file present
&& if [ -f .${LICENSE_DIR}/gurobi.lic ] ; then \
gurobi_package='gurobi'${GUROBI_VERSION}'_linux64.tar.gz' \
&& if [ ! -f tmp/$gurobi_package ] ; then \
if [ ${VERBOSE} -ne 0 ] ; then echo 'Fetching Gurobi...' ; fi \
&& wget -qP tmp/ 'https://packages.gurobi.com/'$( echo ${GUROBI_VERSION} | sed 's/\(^[0-9]*.[0-9]*\).*/\1/' )'/'$gurobi_package ; \
fi \
&& mkdir -p .${GUROBI_HOME} \
&& tar xzf tmp/$gurobi_package -C ./tmp \
#Only keep what is necessary
&& for to_keep in 'lib' 'include' 'bin' 'setup.py'; \
do mv './tmp/gurobi'$( echo ${GUROBI_VERSION} | sed -e 's/\.//g' )'/linux64/'$to_keep .${GUROBI_HOME}/ ; \
done ; \
else \
if [ ${VERBOSE} -ne 0 ] ; then echo "No Gurobi license, skipping Gurobi installation" ; fi ; \
fi

# Remove tmp & remove dos2unix
RUN echo \
&& rm -rf tmp \
# Ensure scripts are Unix compatible using dos2unix
&& apt-get update && apt-get install -y dos2unix \
&& find .${MASS_INSTALL}/docker/docker-scripts/ -name "*.sh" -exec dos2unix {} ";" \
&& apt-get --purge remove -y dos2unix \
&& rm -rf /var/lib/apt/lists/*

# Final build stage install Python API if they exist and adds new user with necessary permissions
FROM mass-setup AS mass-builder
WORKDIR ${HOME}
RUN echo \
# Install cplex module (Python API) for the IBM CPLEX Optimization Studio if present
&& .${MASS_INSTALL}/docker/docker-scripts/pyinstall-solver.sh \
--directory ${HOME}${CPLEX_HOME} \
--solver "CPLEX" \
--verbose ${VERBOSE} \
# Install gurobipy module (Python API) for the Gurobi Optimizer if present
&& .${MASS_INSTALL}/docker/docker-scripts/pyinstall-solver.sh \
--directory ${HOME}${GUROBI_HOME} \
--solver "Gurobi" \
--verbose ${VERBOSE}

# Make directories for volume in product workspace
WORKDIR ${HOME}${PROJECT_VOLUME}

# Set home as final work directory
WORKDIR ${HOME}

# Add user and set user permissions for everything in home folder
RUN echo \
&& groupadd -g ${GID} ${GROUP} \
&& useradd -M -g ${GID} -G ${GROUP} -u ${UID} ${USER} \
&& chown -R ${USER} ${HOME}/ \
&& chmod -R 777 ${HOME}/

USER ${USER}
ENTRYPOINT [ "./opt/MASSpy/docker/docker-scripts/docker-entrypoint.sh" ]
CMD [ "sh" ]

0 comments on commit 4baa2b6

Please sign in to comment.