Skip to content

Instantly share code, notes, and snippets.

@twavv
Created July 14, 2018 01:11
Show Gist options
  • Save twavv/769516ce9dec7c1da68f30ec48e5802b to your computer and use it in GitHub Desktop.
Save twavv/769516ce9dec7c1da68f30ec48e5802b to your computer and use it in GitHub Desktop.
FROM krallin/ubuntu-tini:16.04
ENV DEBIAN_FRONTEND=noninteractive \
DEBCONF_NONINTERACTIVE_SEEN=true \
SHELL=/bin/bash \
NB_USER=nbuser \
NB_UID=1000 \
LC_ALL=en_US.UTF-8 \
LANG=en_US.UTF-8 \
LANGUAGE=en_US.UTF-8
RUN apt-get update && \
apt-get install -y locales && \
locale-gen en_US.UTF-8 && \
apt-get upgrade -y
RUN echo 'deb [trusted=yes] http://ppa.launchpad.net/jonathonf/python-3.6/ubuntu xenial main' \
>> /etc/apt/sources.list &&\
apt-get update &&\
apt-get install -y \
python3.6-dev python3.6-venv npm nodejs-legacy\
build-essential wget bzip2 ca-certificates sudo \
locales fonts-liberation debhelper dpkg-dev \
libarpack2-dev libdouble-conversion-dev libdsfmt-dev \
libfftw3-dev libgmp-dev libjs-mathjax libmpfr-dev \
libopenblas-dev libopenlibm-dev libopenspecfun-dev \
libpcre2-dev libsuitesparse-dev libunwind8-dev \
libutf8proc-dev llvm-3.8-dev python3-sphinx \
python3-sphinx-rtd-theme python3 python3-pip \
python python-pip libcurl4-openssl-dev libssl-dev \
git vim curl emacs bash-completion command-not-found \
libzmq3-dev hdf5-tools debhelper dh-exec llvm-3.5-dev \
libdouble-conversion-dev libsuitesparse-dev libgmp-dev libunwind8-dev \
libfftw3-dev libpcre3-dev libarpack2-dev libmpfr-dev libopenblas-dev \
libopenlibm-dev libopenspecfun-dev patchelf python-sphinx \
python-sphinx-rtd-theme libjs-mathjax m4 gfortran cmake libssl-dev \
jq unzip ffmpeg iputils-ping && \
rm -rf /var/cache/apt
RUN curl https://bootstrap.pypa.io/get-pip.py | python3.6 && \
pip3.6 --no-cache-dir install 'jupyterhub==0.8.1' pycurl setuptools==20.4
RUN mkdir -p /opt/julia-0.6 &&\
cd /opt/julia-0.6 &&\
curl https://julialang-s3.julialang.org/bin/linux/x64/0.6/julia-0.6.1-linux-x86_64.tar.gz | tar -xz --strip-components=1 &&\
ln -s /opt/julia-0.6/bin/julia /usr/local/bin/julia &&\
ln -s /opt/julia-0.6/bin/julia /usr/local/bin/julia0.6
# create local non-root user account
RUN useradd --create-home --shell $SHELL --uid $NB_UID $NB_USER
WORKDIR /home/$NB_USER
USER $NB_USER
# Install Julia packages/modules/whatever they're called
RUN for pkg in Flux GraphIO Clustering LightGraphs GraphPlot DataFrames CSV Hungarian Knet ArgParse Netpbm JLD2 GeometryTypes WAV StatPlots GR ProgressMeter ZMQ HDF5 RDatasets Plots Plotly Optim ForwardDiff ReverseDiff Interact HttpParser MAT Colors IterativeSolvers Convex BenchmarkTools DistributedArrays Colors Images ImageMagick SCS; do \
echo "Pkg.add(\"$pkg\")"; \
/opt/julia-0.6/bin/julia -e "Pkg.add(\"$pkg\"); using $pkg" ;\
done
RUN /opt/julia-0.6/bin/julia -e 'Pkg.add("LsqFit", v"0.3.0"); using LsqFit'
# Pymanopt
ENV PYTHON="/home/nbuser/.julia/v0.6/Conda/deps/usr/bin/python"
RUN julia -e '\
Pkg.add("Conda"); \
using Conda; \
Conda.add("conda");' && \
/home/nbuser/.julia/v0.6/Conda/deps/usr/bin/conda install -y conda==4.4.7 && \
/home/nbuser/.julia/v0.6/Conda/deps/usr/bin/conda config --add channels conda-forge && \
/home/nbuser/.julia/v0.6/Conda/deps/usr/bin/conda install --debug --verbose -y \
numpy autograd scipy==0.19
RUN PYTHON="/home/nbuser/.julia/v0.6/Conda/deps/usr/bin/python" \
/opt/julia-0.6/bin/julia -e '\
Pkg.add("PyCall"); \
using PyCall, Conda;'
# Conda.add_channel("conda-forge"); \
# Conda.add("numpy"); \
# Conda.add("autograd"); \
# @pyimport pip; \
# pip.main(["install", "--upgrade", "pip"]); \
# pip.main(["install", "scipy==0.19"])'
# this doesn't like to work if it's in the same command group as above
# This is broken beacuse pip.main was deprecated/never actually supported
#RUN PYTHON="/home/nbuser/.julia/v0.6/Conda/deps/usr/bin/python" julia -e '\
# using PyCall, Conda; \
# @pyimport pip; \
# pip.main(["install", "scipy==0.19", "pymanopt"])'
RUN /home/nbuser/.julia/v0.6/Conda/deps/usr/bin/pip install \
scipy==0.19 \
pymanopt
# This seems to fail if it's in the big group of packages above
RUN /opt/julia-0.6/bin/julia -e 'Pkg.add("StatPlots"); using StatPlots; Pkg.add("LaTeXStrings"); using LaTeXStrings;'
# make sure it works
RUN julia -e '\
using PyCall; \
@pyimport pymanopt; \
@pyimport pymanopt.manifolds as mani; \
@pyimport pymanopt.solvers as solvers; \
@pyimport autograd.numpy as np'
ENV PATH=/home/nbuser/.local/bin:$PATH
RUN pip3 install --user widgetsnbextension jupyter_contrib_nbextensions RISE \
ipywidgets && \
jupyter nbextension enable --py widgetsnbextension && \
jupyter contrib nbextension install --user && \
jupyter nbextensions_configurator disable && \
jupyter nbextension enable collapsible_headings/main &&\
jupyter nbextension enable codefolding/main && \
jupyter nbextension enable toc2/main && \
jupyter nbextension enable equation-numbering/main
RUN jupyter-nbextension install rise --py --user && \
jupyter-nbextension enable rise --py --user
# install scratchpad and copyright-statement and remotefs
RUN git clone https://github.com/minrk/nbextension-scratchpad.git /tmp/nbextension-scratchpad && \
jupyter nbextension install --user /tmp/nbextension-scratchpad && \
jupyter nbextension enable nbextension-scratchpad/main && \
rm -rf /tmp/nbextension-scratchpad && \
git clone https://github.com/travigd/jupyter-copyright-statement.git /tmp/copyright-statement &&\
jupyter nbextension install --user /tmp/copyright-statement/copyright-statement && \
rm -rf /tmp/copyright-statement && \
git clone https://github.com/travigd/jupyter-remotefs.git /tmp/jupyter-remotefs && \
pip3 install --user /tmp/jupyter-remotefs && \
rm -rf /tmp/jupyter-remotefs
COPY copyright_statement.json .jupyter/nbconfig/copyright_statement.json
RUN if [ ! -f .jupyter/nbconfig/tree.json ]; then \
echo "{}" > .jupyter/nbconfig/tree.json; \
fi; \
tmpfile=$(mktemp); \
jq '. + {load_extensions: (.load_extensions + {"jbook/tree/main": true, "copyright-statement/main": true})}' .jupyter/nbconfig/tree.json > $tmpfile; \
cat $tmpfile; \
mv $tmpfile .jupyter/nbconfig/tree.json;
#COPY tree.json .jupyter/nbconfig/tree.json
RUN cat .jupyter/nbconfig/tree.json
#RUN echo ~ && echo $USER && cat /home/nbuser/.jupyter/nbconfig/copyright_statement.json && cat /home/nbuser/.jupyter/nbconfig/tree.json
RUN tmpfile=$(mktemp) && \
cat ~/.jupyter/nbconfig/notebook.json \
| jq '. + {toc2: (.toc2 + {"toc_cell": true})}' \
| jq '. + {load_extensions: (.load_extensions + {"jbook/read": true})}' \
| jq '. + {CodeCell: (.CodeCell + {"cm_config":{"lineNumbers": true}})}' \
> $tmpfile && \
cat $tmpfile > ~/.jupyter/nbconfig/notebook.json && \
cat ~/.jupyter/nbconfig/notebook.json && \
rm -f $tmpfile
# Install WebWidgets
RUN /opt/julia-0.6/bin/julia -e '\
isinstalled(pkg) = isdir(Pkg.dir(pkg)); \
function installgizmo(pkg) \
isinstalled(pkg) || Pkg.clone("https://github.com/JuliaGizmos/$(pkg).jl"); \
end; \
function installweb(pkg) \
if isinstalled(pkg) \
Pkg.checkout(pkg); \
else \
Pkg.clone("https://github.com/SimonDanisch/$(pkg).jl"); \
end \
end; \
installweb("WebWidgets"); \
installweb("WebPlayer"); \
installweb("WebStitcher"); \
isinstalled("WebIO") && Pkg.rm("WebIO"); \
installgizmo("WebIO"); Pkg.checkout("WebIO", "legacy"); \
Pkg.checkout("Observables"); \
installgizmo("Vue");Pkg.checkout("Vue", "legacy"); \
installgizmo("CSSUtil"); \
installgizmo("InteractNext");Pkg.checkout("InteractNext", "legacy"); \
asset_dir = Pkg.dir("WebStitcher", "assets"); \
wio_asset_dir = Pkg.dir("WebIO", "assets"); \
isdir(wio_asset_dir) && rm(wio_asset_dir, recursive = true); \
mkdir(wio_asset_dir); \
for elem in readdir(asset_dir) \
file_source = joinpath(asset_dir, elem); \
file_target = joinpath(wio_asset_dir, elem); \
if !(isfile(file_target) || isdir(file_target)) \
try \
println("Copying: $file_target"); \
cp(file_source, file_target); \
catch e \
warn(e); \
end \
end \
end; \
Pkg.add("IJulia"); \
Pkg.build("WebIO"); \
using IJulia, WebWidgets, WebPlayer, WebStitcher'
COPY --chown=1000:1000 jbook-nbextension/dist \
/home/nbuser/.local/share/jupyter/nbextensions/jbook
COPY --chown=1000:1000 jbook.json \
/home/nbuser/.jupyter/nbconfig/jbook.json
COPY --chown=1000:1000 jupyter_notebook_config.py \
/home/nbuser/.local/etc/jupyter/jupyter_notebook_config.py
USER $NB_USER
ENV PATH=~/.local/bin:$PATH
# no cmd (set by spawner)
# todo: maybe try to union mount /home/nbuser instead of forcing stuff into work?
USER root
RUN mkdir /home/$NB_USER/work && \
chown 1000:1000 -R /home/$NB_USER/work
USER $NB_USER
WORKDIR /home/$NB_USER/work
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment