Created
July 14, 2018 01:11
-
-
Save twavv/769516ce9dec7c1da68f30ec48e5802b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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