From 47a1d26ce12c961191239b3cd141d1abf260aac4 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 17 Dec 2016 15:20:11 -0700 Subject: [PATCH 01/97] adding a browser for internal development --- icewiesel/Dockerfile | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 icewiesel/Dockerfile diff --git a/icewiesel/Dockerfile b/icewiesel/Dockerfile new file mode 100644 index 0000000..e7a0368 --- /dev/null +++ b/icewiesel/Dockerfile @@ -0,0 +1,48 @@ +#author Russell Jarvis rjjarvis@asu.edu +#author Rick Gerkin rgerkin@asu.edu + +FROM scidash/neuronunit +USER ROOT +RUN apt-get install -y iceweisel + +RUN python -c "import pyneuroml" + +RUN conda install -y pyqt +#RUN conda install -y matplotlib + +RUN mkdir $HOME/work/scidash +ENV WORK_HOME $HOME/work/scidash + +RUN git clone -b dev https://github.com/scidash/sciunit.git $WORK_HOME/sciunit +ENV PYTHONPATH=$PYTHONPATH:$WORK_HOME/sciunit +RUN python -c "import sciunit" + +RUN git clone -b dev https://github.com/scidash/neuronunit.git $WORK_HOME/neuronunit +ENV PYTHONPATH=$PYTHONPATH:$WORK_HOME/neuronunit +RUN chown -R jovyan $HOME +RUN find /opt/conda ! -user jovyan -print0 | xargs -0 -I {} chown jovyan {} + +USER $NB_USER + + + +RUN python -c "import neuronunit" +RUN python -c "from neuronunit.models.reduced import ReducedModel" +RUN python -c "import quantities" +RUN python -c "import neuron" +RUN python -c "import pyneuroml" +RUN nrnivmodl +RUN python -c "import scoop" +RUN python -c "import deap" +RUN nrniv + +#The following are convenience aliases +RUN echo 'alias nb="jupyter-notebook --ip=* --no-browser"' >> ~/.bashrc +RUN echo 'alias mnt="cd /home/mnt"' >> ~/.bashrc +RUN echo 'alias erc="emacs ~/.bashrc"' >> ~/.bashrc +RUN echo 'alias src="source ~/.bashrc"' >> ~/.bashrc +RUN echo 'alias egg="cd /opt/conda/lib/python3.5/site-packages/"' >> ~/.bashrc +RUN echo 'alias nu="cd /home/jovyan/work/scidash/neuronunit"' >> ~/.bashrc +RUN echo 'alias model="cd /work/scidash/neuronunit/neuronunit/models"' >> ~/.bashrc +RUN echo 'alias sciunit="cd /work/scidash/sciunit"' >> ~/.bashrc +RUN echo 'alias nu="python -c "from neuronunit.models.reduced import ReducedModel""' From e8a9121e19fc4540abbc458c9f5c4c45f7ba363e Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 17 Dec 2016 15:21:20 -0700 Subject: [PATCH 02/97] adding a browser for internal development --- icewiesel/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/icewiesel/Dockerfile b/icewiesel/Dockerfile index e7a0368..35b59b2 100644 --- a/icewiesel/Dockerfile +++ b/icewiesel/Dockerfile @@ -3,7 +3,9 @@ FROM scidash/neuronunit USER ROOT -RUN apt-get install -y iceweisel +RUN add-apt-repository ppa:webupd8team/sublime-text-2 +RUN apt-get update +RUN apt-get install -y iceweisel gedit atom RUN python -c "import pyneuroml" From 426693806a05f371fa13e72dc60119f1519c8a19 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 17 Dec 2016 15:21:50 -0700 Subject: [PATCH 03/97] adding a browser for internal development --- icewiesel/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icewiesel/Dockerfile b/icewiesel/Dockerfile index 35b59b2..62cdd81 100644 --- a/icewiesel/Dockerfile +++ b/icewiesel/Dockerfile @@ -5,7 +5,7 @@ FROM scidash/neuronunit USER ROOT RUN add-apt-repository ppa:webupd8team/sublime-text-2 RUN apt-get update -RUN apt-get install -y iceweisel gedit atom +RUN apt-get install -y iceweisel gedit atom sublime-text RUN python -c "import pyneuroml" From 4ff9bcfab3510eb4b64e0f495a7e6594196b5def Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 17 Dec 2016 15:26:28 -0700 Subject: [PATCH 04/97] spelling correction --- {icewiesel => iceweasel}/Dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {icewiesel => iceweasel}/Dockerfile (100%) diff --git a/icewiesel/Dockerfile b/iceweasel/Dockerfile similarity index 100% rename from icewiesel/Dockerfile rename to iceweasel/Dockerfile From 7d0550369bc419e07ea71e2b4241147accf22861 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 17 Dec 2016 17:04:27 -0700 Subject: [PATCH 05/97] support for making a complete graphical development environment --- iceweasel/Dockerfile | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/iceweasel/Dockerfile b/iceweasel/Dockerfile index 62cdd81..e7dd88f 100644 --- a/iceweasel/Dockerfile +++ b/iceweasel/Dockerfile @@ -1,29 +1,20 @@ #author Russell Jarvis rjjarvis@asu.edu #author Rick Gerkin rgerkin@asu.edu - FROM scidash/neuronunit -USER ROOT -RUN add-apt-repository ppa:webupd8team/sublime-text-2 +USER root + RUN apt-get update -RUN apt-get install -y iceweisel gedit atom sublime-text +RUN apt-get install -y iceweasel gedit meld gvfs-bin +RUN wget https://atom.io/download/deb -O atom.deb +RUN dpkg -i atom.deb RUN python -c "import pyneuroml" -RUN conda install -y pyqt -#RUN conda install -y matplotlib -RUN mkdir $HOME/work/scidash -ENV WORK_HOME $HOME/work/scidash -RUN git clone -b dev https://github.com/scidash/sciunit.git $WORK_HOME/sciunit -ENV PYTHONPATH=$PYTHONPATH:$WORK_HOME/sciunit -RUN python -c "import sciunit" +ENV WORK_HOME $HOME/work/scidash -RUN git clone -b dev https://github.com/scidash/neuronunit.git $WORK_HOME/neuronunit -ENV PYTHONPATH=$PYTHONPATH:$WORK_HOME/neuronunit RUN chown -R jovyan $HOME -RUN find /opt/conda ! -user jovyan -print0 | xargs -0 -I {} chown jovyan {} - USER $NB_USER @@ -39,7 +30,9 @@ RUN python -c "import deap" RUN nrniv #The following are convenience aliases -RUN echo 'alias nb="jupyter-notebook --ip=* --no-browser"' >> ~/.bashrc +RUN echo 'alias nb="jupyter-notebook' + + RUN echo 'alias mnt="cd /home/mnt"' >> ~/.bashrc RUN echo 'alias erc="emacs ~/.bashrc"' >> ~/.bashrc RUN echo 'alias src="source ~/.bashrc"' >> ~/.bashrc From 796de6209bdf008b6bec77b2eeb5023ca47fba96 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 17 Dec 2016 17:15:02 -0700 Subject: [PATCH 06/97] edited readme for this branch only --- README.md | 31 ++++++++++++++++++++++++++++++- iceweasel/README.md | 26 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 iceweasel/README.md diff --git a/README.md b/README.md index 2cbbc3e..6c66782 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,33 @@ -# A hierarchy of Docker images with Jupyter notebooks, a typical Python scientific computing stack, NEURON-7.4, scoop, DEAP, sciunit, and neuronunit. + + +### A hierarchy of Docker images with Jupyter notebooks, a typical Python scientific computing stack, NEURON-7.4, scoop, DEAP, sciunit, and neuronunit. + +## Support for graphical development ipython notebook. + +Docker image internal support for graphical browser (`iceweasel`), graphical git merge (`meld`), and code editor (`atom` and `gedit`). + +## For an Ubuntu host: +This works very easily. +launching: +I have defined the alias in my `~/.bashrc`: +`drh` (Docker Run Here): + +``` +alias drh=' sudo docker run -it -e DISPLAY=$DISPLAY -v `pwd`:/home/mnt \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + deapscoop1 /bin/bash' +``` +The alias probably should instead be function that is able to accept arguments also. + +## For an Apple/MAC host + +OSX doesn't have a default x11 server so you must install quartz. + +https://fredrikaverpil.github.io/2016/07/31/docker-for-mac-and-gui-applications/ + +This works because you are mounting the volume associated with your hosts.X11 server binary, and passing in your hosts environmental variable. I anticipate a future when the drh command will become very long. + +The next step is to build this outside of and on-top of docker-stacks images using docker-compose, and also getting docker compose to fill out my github credentials. Purpose: The building of development environments raises an unnecessary technical problem. In many cases even if someone has the technical capacity to build, it does not mean they will have time too. In order to remove this barrier to participation we have attempted to create some useful docker images. diff --git a/iceweasel/README.md b/iceweasel/README.md new file mode 100644 index 0000000..845111d --- /dev/null +++ b/iceweasel/README.md @@ -0,0 +1,26 @@ +## Support for graphical development ipython notebook. + +Docker image internal support for graphical browser (`iceweasel`), graphical git merge (`meld`), and code editor (`atom` and `gedit`). + +## For an Ubuntu host: +This works very easily. +launching: +I have defined the alias in my `~/.bashrc`: +`drh` (Docker Run Here): + +``` +alias drh=' sudo docker run -it -e DISPLAY=$DISPLAY -v `pwd`:/home/mnt \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + deapscoop1 /bin/bash' +``` +The alias probably should instead be function that is able to accept arguments also. + +## For an Apple/MAC host + +OSX doesn't have a default x11 server so you must install quartz. + +https://fredrikaverpil.github.io/2016/07/31/docker-for-mac-and-gui-applications/ + +This works because you are mounting the volume associated with your hosts.X11 server binary, and passing in your hosts environmental variable. I anticipate a future when the drh command will become very long. + +The next step is to build this outside of and on-top of docker-stacks images using docker-compose, and also getting docker compose to fill out my github credentials. From 389159c52bd9649f6233169a129c59b697dc77a4 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sun, 5 Feb 2017 19:20:31 -0700 Subject: [PATCH 07/97] Update Dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1377c35..14eb5fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -173,8 +173,8 @@ RUN python -c "import scoop; import deap" RUN sudo /opt/conda/bin/conda install matplotlib - Contact GitHub API Training Shop Blog About +# Contact GitHub API Training Shop Blog About - © 2016 GitHub, Inc. Terms Privacy Security Status Help +# © 2016 GitHub, Inc. Terms Privacy Security Status Help From f8c7787a0dfdb96887814d1280ff7009161d0930 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 13 Mar 2017 10:44:39 -0700 Subject: [PATCH 08/97] refactored --- neuron-mpi-neuroml/Dockerfile | 37 +++++++------- .../Dockerfile | 2 +- neuronunit/.gitignore | 20 -------- neuronunit/Dockerfile | 51 ------------------- 4 files changed, 21 insertions(+), 89 deletions(-) rename {neuronunit-docs => neuronunit-showcase}/Dockerfile (97%) delete mode 100644 neuronunit/.gitignore delete mode 100644 neuronunit/Dockerfile diff --git a/neuron-mpi-neuroml/Dockerfile b/neuron-mpi-neuroml/Dockerfile index 7d949fe..16b0b82 100644 --- a/neuron-mpi-neuroml/Dockerfile +++ b/neuron-mpi-neuroml/Dockerfile @@ -1,30 +1,29 @@ -#author Russell Jarvis rjjarvis@asu.edu -#author Rick Gerkin rgerkin@asu.edu FROM scidash/scipy-notebook-plus +USER root WORKDIR $HOME -RUN wget https://www.open-mpi.org/software/ompi/v2.0/downloads/openmpi-2.0.0.tar.gz -RUN tar -xzf openmpi-2.0.0.tar.gz && rm openmpi-2.0.0.tar.gz -WORKDIR $HOME/openmpi-2.0.0 -# Compile openmpi -RUN ./configure -RUN make all -RUN sudo make install # Get python bindings for open mpi -WORKDIR $HOME -RUN conda install -y mpi4py ipython + +RUN apt-get update; apt-get install -y automake libtool build-essential openmpi-bin libopenmpi-dev git vim \ + wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ + python3-pip python3-numpy python3-scipy python3-matplotlib python3-jinja2 python3-mock \ + ipython3 python3-httplib2 python3-docutils python3-yaml \ + python3-venv python3-mpi4py python3-tables cmake + + # Install NEURON-7.4 with python, with MPI # An infamous build process,and much of the motivation for this container RUN wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.4/nrn-7.4.tar.gz -RUN tar -xzf nrn-7.4.tar.gz && rm nrn-7.4.tar.gz +RUN tar -xzf nrn-7.4.tar.gz && rm nrn-7.4.tar.gz WORKDIR $HOME/nrn-7.4 -RUN ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python --with-paranrn=/usr/bin/mpiexec +RUN ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python --with-paranrn RUN make all -RUN sudo make install +#RUN conda install 2to3 +RUN make install # Create python bindings for NEURON WORKDIR src/nrnpython @@ -33,9 +32,13 @@ ENV NEURON_HOME $HOME/nrn-7.4/x86_64 ENV PATH $NEURON_HOME/bin:$PATH WORKDIR $HOME + +#RUN /usr/bin/mpiexec -np 4 nrniv -mpi $HOME/neuron/nrn-7.4/src/parallel/test0.hoc +#RUN /usr/bin/mpiexec -np 4 nrniv -mpi=/usr/bin/mpiexec $HOME/neuron/nrn-7.4/src/parallel/test0.hoc + # Get JNeuroML #Change to this when PR is accepted #RUN git clone https://github.com/NeuroML/jNeuroML -RUN git clone https://github.com/russelljjarvis/jNeuroML.git -WORKDIR jNeuroML -RUN python getNeuroML.py +#RUN git clone https://github.com/russelljjarvis/jNeuroML.git +#WORKDIR jNeuroML +#RUN python getNeuroML.py diff --git a/neuronunit-docs/Dockerfile b/neuronunit-showcase/Dockerfile similarity index 97% rename from neuronunit-docs/Dockerfile rename to neuronunit-showcase/Dockerfile index c1de817..40f73bb 100644 --- a/neuronunit-docs/Dockerfile +++ b/neuronunit-showcase/Dockerfile @@ -1,7 +1,7 @@ #author Russell Jarvis rjjarvis@asu.edu #author Rick Gerkin rgerkin@asu.edu -FROM scidash/sciunitopt +FROM scidash/neuronunit #Install channelworm RUN pip install django diff --git a/neuronunit/.gitignore b/neuronunit/.gitignore deleted file mode 100644 index a678a9d..0000000 --- a/neuronunit/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -AIBS.ipynb -AIBS.py -AIBS.py~ -Dockerfile -Dockerfile_Examples -LEMS_2007One.xml -README.md -deap_config.py -deap_config_nsga.py -deap_config_simple_sum.py -deap_config_simple_sum.pyc -example.ipynb -example.py -example_code_from_inside_readme.py -example_code_from_inside_readme.py~ -manifest.json -nsga1.py -observations.pickle -simple.py -simple.pyc \ No newline at end of file diff --git a/neuronunit/Dockerfile b/neuronunit/Dockerfile deleted file mode 100644 index 847ac02..0000000 --- a/neuronunit/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -#author Russell Jarvis rjjarvis@asu.edu -#author Rick Gerkin rgerkin@asu.edu - -FROM scidash/neuron-mpi-neuroml - -RUN pip install neo -RUN pip install elephant -RUN pip install bs4 -RUN pip install quantities -RUN pip install execnet -RUN pip install git+https://github.com/soravux/scoop -RUN pip install git+https://github.com/DEAP/deap -RUN pip install git+https://github.com/rgerkin/rickpy -RUN pip install git+https://github.com/NeuroML/pyNeuroML --process-dependency-links -#Install rgerkin version of AllenSDK -RUN pip install git+https://github.com/rgerkin/AllenSDK@python3.5 --process-dependency-links -#RUN pip install git+https://github.com/python-quantities/python-quantities -RUN python -c "import pyneuroml" - -RUN conda install -y pyqt -#RUN conda install -y matplotlib - -RUN mkdir $HOME/work/scidash -ENV WORK_HOME $HOME/work/scidash - -RUN git clone -b dev https://github.com/scidash/sciunit.git $WORK_HOME/sciunit -ENV PYTHONPATH=$PYTHONPATH:$WORK_HOME/sciunit -RUN python -c "import sciunit" - -RUN git clone -b dev https://github.com/scidash/neuronunit.git $WORK_HOME/neuronunit -ENV PYTHONPATH=$PYTHONPATH:$WORK_HOME/neuronunit -RUN python -c "import neuronunit" -RUN python -c "from neuronunit.models.reduced import ReducedModel" -RUN python -c "import quantities" -RUN python -c "import neuron" -RUN python -c "import pyneuroml" -RUN nrnivmodl -RUN python -c "import scoop" -RUN python -c "import deap" -RUN nrniv - -#The following are convenience aliases -RUN echo 'alias nb="jupyter-notebook --ip=* --no-browser"' >> ~/.bashrc -RUN echo 'alias mnt="cd /home/mnt"' >> ~/.bashrc -RUN echo 'alias erc="emacs ~/.bashrc"' >> ~/.bashrc -RUN echo 'alias src="source ~/.bashrc"' >> ~/.bashrc -RUN echo 'alias egg="cd /opt/conda/lib/python3.5/site-packages/"' >> ~/.bashrc -RUN echo 'alias nu="cd /home/jovyan/work/scidash/neuronunit"' >> ~/.bashrc -RUN echo 'alias model="cd /work/scidash/neuronunit/neuronunit/models"' >> ~/.bashrc -RUN echo 'alias sciunit="cd /work/scidash/sciunit"' >> ~/.bashrc -RUN echo 'alias nu="python -c "from neuronunit.models.reduced import ReducedModel""' \ No newline at end of file From d6cb42facdb6a8e1110e4f4d5176073fb510541d Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 13 Mar 2017 13:22:55 -0700 Subject: [PATCH 09/97] changed dockerfile --- Dockerfile | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2e24af2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,115 @@ +#author russell jarvis rjjarvis@asu.edu +#NEURON Dockerfile +#Set the base image to Ubuntu +FROM ubuntu +#Get a whole lot of GNU core development tools +#version control java development, maven +#Libraries required for building MPI from source +#Libraries required for building NEURON from source +#Also DO this part as root. + +RUN apt-get update && apt-get install -y wget bzip2 ca-certificates \ + libglib2.0-0 libxext6 libsm6 libxrender1 \ + git gcc g++ build-essential \ + libglib2.0-0 libxext6 libsm6 libxrender1 \ + libncurses-dev openmpi-bin openmpi-doc libopenmpi-dev + +RUN apt-get update; apt-get install -y automake libtool git vim \ + wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ + python3-pip python3-numpy python3-scipy python3-matplotlib python3-mock \ + ipython3 python3-docutils python3-yaml \ + python3-venv python3-mpi4py python3-tables cmake + + + +#RUN pip install --upgrade pip \ +# && pip install -U setuptools + + + +#The following code is adapted from: +#https://github.com/ContinuumIO/docker-images/blob/master/anaconda/Dockerfile + +RUN echo 'export PATH=/opt/conda/bin:$PATH' > /etc/profile.d/conda.sh && \ + wget --quiet https://repo.continuum.io/miniconda/Miniconda3-3.7.0-Linux-x86_64.sh -O miniconda.sh -O ~/miniconda.sh && \ + /bin/bash ~/miniconda.sh -b -p /opt/conda && \ + rm ~/miniconda.sh + +#Do the rest of the build as user: +#This will create a more familiar environment to continue developing in. +#with less of a need to chown and chmod everything done as root at dockerbuild completion + + +#Test matplotlib +#Install General MPI, such that mpi4py can later bind with it. + +#WORKDIR $HOME + +#Install NEURON-7.4 with python, with MPI. An infamous build process, +#and much of the motivation for this docker container +# Fetch NEURON source files, extract them, delete .tar.gz file. + +#Create python bindings for NEURON +#WORKDIR src/nrnpython +#RUN sudo python setup.py install +#--with-nrnpython=/opt/conda/bin/python +RUN which mpirun +#RUN mpirun -np 4 nrniv -mpi $HOME/neuron/nrn-7.4/src/parallel/test1.hoc +#RUN /usr/bin/mpiexec -np 4 nrniv -mpi $HOME/neuron/nrn-7.4/src/parallel/test2.hoc +WORKDIR /home/docker +ENV HOME /home/docker +RUN echo 'rerun' +WORKDIR $HOME +RUN \ + wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.4/nrn-7.4.tar.gz && \ + tar -xzf nrn-7.4.tar.gz && \ + rm nrn-7.4.tar.gz + +WORKDIR $HOME/nrn-7.4 +RUN whereis python3 +ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH +#RUN ls -ltr configure +RUN ./configure --prefix=`pwd` --with-paranrn --without-iv --with-nrnpython=/usr/bin/python3 +RUN make all && \ + make install +ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH + + +RUN useradd -ms /bin/bash docker +USER root +RUN apt-get update \ + && apt-get install -y sudo \ + && rm -rf /var/lib/apt/lists/* +RUN echo "docker ALL=NOPASSWD: ALL" >> /etc/sudoers + + + + +ENV HOME /home/docker +ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH +ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH + + + + +RUN apt-get update && apt-get install -y wget bzip2 ca-certificates \ + libglib2.0-0 libxext6 libsm6 libxrender1 \ + git gcc g++ build-essential \ + libncurses-dev openmpi-bin openmpi-doc libopenmpi-dev \ + default-jre default-jdk maven emacs + +WORKDIR $HOME/git +#TODO change back to this repository, once pull request as accepted for python3 compliant code +#RUN sudo git clone https://github.com/NeuroML/jNeuroML +RUN git clone https://github.com/russelljjarvis/jNeuroML.git +WORKDIR jNeuroML +RUN python getNeuroML.py + + +USER docker +RUN sudo chown -R docker:docker /home/docker +#WORKDIR $HOME/nrn-7.4/src/parallel +#RUN mpiexec -np 4 nrniv -mpi test0.hoc + + + From a0800dd321384788ea4872129a45ac29e0d12a8f Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 29 Mar 2017 15:28:26 -0700 Subject: [PATCH 10/97] commit before merge --- containers.pdf | Bin 0 -> 274146 bytes neuron-mpi-neuroml/Dockerfile | 14 +++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 containers.pdf diff --git a/containers.pdf b/containers.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d34dedd72bd6fcb09e8fb1e34f985ec1ec480f22 GIT binary patch literal 274146 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ƶ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 z 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%0DVA)JQK0lekONM)^H*kuUy>~Q%lON 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 literal 0 HcmV?d00001 diff --git a/neuron-mpi-neuroml/Dockerfile b/neuron-mpi-neuroml/Dockerfile index 16b0b82..de86dfd 100644 --- a/neuron-mpi-neuroml/Dockerfile +++ b/neuron-mpi-neuroml/Dockerfile @@ -1,5 +1,9 @@ -FROM scidash/scipy-notebook-plus +#FROM scidash/scipy-notebook-plus +FROM neuralensemble/base +MAINTAINER andrew.davison@unic.cnrs-gif.fr +ENV NEST_VER=2.12.0 NRN_VER=7.4 + USER root WORKDIR $HOME @@ -38,7 +42,7 @@ WORKDIR $HOME # Get JNeuroML #Change to this when PR is accepted -#RUN git clone https://github.com/NeuroML/jNeuroML -#RUN git clone https://github.com/russelljjarvis/jNeuroML.git -#WORKDIR jNeuroML -#RUN python getNeuroML.py +RUN git clone https://github.com/NeuroML/jNeuroML +RUN git clone https://github.com/russelljjarvis/jNeuroML.git +WORKDIR jNeuroML +RUN python getNeuroML.py From 4224b3df042146ff1423233e3a519ebd295cb413 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 11 May 2017 17:47:08 -0700 Subject: [PATCH 11/97] fixed parallel NEURON --- Dockerfile | 89 ++++++++++++++++++------------------------------------ 1 file changed, 29 insertions(+), 60 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0e5f567..e0ba53c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,41 +1,34 @@ #author russell jarvis rjjarvis@asu.edu #NEURON Dockerfile #Set the base image to Ubuntu -FROM ubuntu +FROM neuralensemble/simulation + #Get a whole lot of GNU core development tools #version control java development, maven #Libraries required for building MPI from source #Libraries required for building NEURON from source #Also DO this part as root. +USER root -RUN apt-get update && apt-get install -y wget bzip2 ca-certificates \ - libglib2.0-0 libxext6 libsm6 libxrender1 \ - git gcc g++ build-essential \ - libglib2.0-0 libxext6 libsm6 libxrender1 \ - libncurses-dev openmpi-bin openmpi-doc libopenmpi-dev \ - default-jre default-jdk maven emacs - +RUN apt-get update && apt-get install -y wget bzip2 ca-certificates default-jre default-jdk maven emacs RUN apt-get update; apt-get install -y automake libtool git vim \ wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ python3-pip python3-numpy python3-scipy python3-matplotlib python3-mock \ ipython3 python3-docutils python3-yaml \ python3-venv python3-mpi4py python3-tables cmake - #The following code is adapted from: -#https://github.com/ContinuumIO/docker-images/blob/master/anaconda/Dockerfile +#https://github.com/ContinuumIO/docker-images/blob/master/anaconda/Dockerfile RUN echo 'export PATH=/opt/conda/bin:$PATH' > /etc/profile.d/conda.sh && \ wget --quiet https://repo.continuum.io/miniconda/Miniconda3-3.7.0-Linux-x86_64.sh -O miniconda.sh -O ~/miniconda.sh && \ /bin/bash ~/miniconda.sh -b -p /opt/conda && \ rm ~/miniconda.sh - + #Do the rest of the build as user: #This will create a more familiar environment to continue developing in. #with less of a need to chown and chmod everything done as root at dockerbuild completion -RUN useradd -ms /bin/bash docker -USER root RUN apt-get update \ && apt-get install -y sudo \ && rm -rf /var/lib/apt/lists/* @@ -43,83 +36,59 @@ RUN echo "docker ALL=NOPASSWD: ALL" >> /etc/sudoers USER docker WORKDIR /home/docker -RUN chown -R docker:docker /home/docker -ENV HOME /home/docker +RUN sudo chown -R docker:docker /home/docker +ENV HOME /home/docker ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH RUN sudo /opt/conda/bin/conda install scipy numpy matplotlib #Test matplotlib RUN /opt/conda/bin/python -c "import matplotlib" #Install General MPI, such that mpi4py can later bind with it. - -#WORKDIR $HOME - -#Install NEURON-7.4 with python, with MPI. An infamous build process, -#and much of the motivation for this docker container -# Fetch NEURON source files, extract them, delete .tar.gz file. - -#Create python bindings for NEURON -#WORKDIR src/nrnpython -#RUN sudo python setup.py install -#--with-nrnpython=/opt/conda/bin/python -RUN which mpirun -#RUN mpirun -np 4 nrniv -mpi $HOME/neuron/nrn-7.4/src/parallel/test1.hoc -#RUN /usr/bin/mpiexec -np 4 nrniv -mpi $HOME/neuron/nrn-7.4/src/parallel/test2.hoc WORKDIR /home/docker -ENV HOME /home/docker -RUN echo 'rerun' + WORKDIR $HOME RUN \ wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.4/nrn-7.4.tar.gz && \ tar -xzf nrn-7.4.tar.gz && \ - rm nrn-7.4.tar.gz + rm nrn-7.4.tar.gz WORKDIR $HOME/nrn-7.4 RUN whereis python3 ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH #RUN ls -ltr configure -RUN ./configure --prefix=`pwd` --with-paranrn --without-iv --with-nrnpython=/usr/bin/python3 -RUN make all && \ +RUN ./configure --prefix=`pwd` --with-paranrn --without-iv --with-nrnpython=/usr/bin/python3 +RUN sudo make all && \ make install ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH - -RUN useradd -ms /bin/bash docker -USER root -RUN apt-get update \ - && apt-get install -y sudo \ - && rm -rf /var/lib/apt/lists/* -RUN echo "docker ALL=NOPASSWD: ALL" >> /etc/sudoers - - -ENV HOME /home/docker +ENV HOME /home/docker ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH - -RUN apt-get update && apt-get install -y wget bzip2 ca-certificates \ - libglib2.0-0 libxext6 libsm6 libxrender1 \ - git gcc g++ build-essential \ - libncurses-dev openmpi-bin openmpi-doc libopenmpi-dev \ - default-jre default-jdk maven emacs - WORKDIR $HOME/git #TODO change back to this repository, once pull request as accepted for python3 compliant code #RUN sudo git clone https://github.com/NeuroML/jNeuroML -RUN git clone https://github.com/russelljjarvis/jNeuroML.git -WORKDIR jNeuroML -RUN python getNeuroML.py +RUN sudo git clone https://github.com/russelljjarvis/jNeuroML.git +WORKDIR $HOME/git/jNeuroML +RUN sudo python getNeuroML.py + - USER docker RUN sudo chown -R docker:docker /home/docker -#WORKDIR $HOME/nrn-7.4/src/parallel -#RUN mpiexec -np 4 nrniv -mpi test0.hoc - - - +WORKDIR /home/docker/nrn-7.4/src/parallel +RUN mpiexec -np 4 nrniv -mpi test0.hoc +RUN mpiexec -np 4 nrniv -mpi test1.hoc +RUN mpiexec -np 4 nrniv -mpi test2.hoc +RUN mpiexec -np 4 nrniv -mpi test3.hoc +RUN mpiexec -np 4 nrniv -mpi test4.hoc +RUN mpiexec -np 4 nrniv -mpi test5.hoc +RUN mpiexec -np 4 nrniv -mpi test6.hoc +RUN mpiexec -np 4 nrniv -mpi test7.hoc + + +#RUN mpiexec -np 4 nrniv -mpi -python test0.py From 57b740b1829a902987c8f9ebfff132d48e782e42 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 11 May 2017 17:51:37 -0700 Subject: [PATCH 12/97] dev changes --- Dockerfile | 4 ++-- test_fixed.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 test_fixed.py diff --git a/Dockerfile b/Dockerfile index e0ba53c..68df2ae 100644 --- a/Dockerfile +++ b/Dockerfile @@ -90,5 +90,5 @@ RUN mpiexec -np 4 nrniv -mpi test5.hoc RUN mpiexec -np 4 nrniv -mpi test6.hoc RUN mpiexec -np 4 nrniv -mpi test7.hoc - -#RUN mpiexec -np 4 nrniv -mpi -python test0.py +ADD ./test_fixed.py /home/docker/nrn-7.4/src/parallel/ +RUN mpiexec -np 4 nrniv -mpi -python test_fixed.py diff --git a/test_fixed.py b/test_fixed.py new file mode 100644 index 0000000..5dd5e90 --- /dev/null +++ b/test_fixed.py @@ -0,0 +1,11 @@ +from neuron import h +pc = h.ParallelContext() + +id = int(pc.id()) +nhost = int(pc.nhost()) + +print('I am %d of %d'%(id, nhost)) + +pc.runworker() +pc.done() +h.quit() From 374b5fa861efada57fa1a5bc96cd0b550500e6d3 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 11 May 2017 17:54:19 -0700 Subject: [PATCH 13/97] now with travis building --- .travis.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..16b94cb --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +language: python +python: + - "3.5" +sudo: required +services: + - docker + - git + - python + +before_script: + - cd ParallelPyNEURON + - docker build -t ppn . +script: + - docker run -it ppn bash + From fb9b5ba28e1f23c018b85113d4accd6fbfccb91d Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 11 May 2017 18:16:50 -0700 Subject: [PATCH 14/97] commit before merge --- Dockerfile | 187 +++++++++++++++++------------------------------------ 1 file changed, 61 insertions(+), 126 deletions(-) diff --git a/Dockerfile b/Dockerfile index 14eb5fb..2e24af2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,20 @@ RUN apt-get update && apt-get install -y wget bzip2 ca-certificates \ libglib2.0-0 libxext6 libsm6 libxrender1 \ git gcc g++ build-essential \ libglib2.0-0 libxext6 libsm6 libxrender1 \ - libncurses-dev openmpi-bin openmpi-doc libopenmpi-dev \ - default-jre default-jdk maven emacs + libncurses-dev openmpi-bin openmpi-doc libopenmpi-dev + +RUN apt-get update; apt-get install -y automake libtool git vim \ + wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ + python3-pip python3-numpy python3-scipy python3-matplotlib python3-mock \ + ipython3 python3-docutils python3-yaml \ + python3-venv python3-mpi4py python3-tables cmake + + + +#RUN pip install --upgrade pip \ +# && pip install -U setuptools + + #The following code is adapted from: #https://github.com/ContinuumIO/docker-images/blob/master/anaconda/Dockerfile @@ -27,154 +39,77 @@ RUN echo 'export PATH=/opt/conda/bin:$PATH' > /etc/profile.d/conda.sh && \ #This will create a more familiar environment to continue developing in. #with less of a need to chown and chmod everything done as root at dockerbuild completion -RUN useradd -ms /bin/bash docker -USER root -RUN apt-get update \ - && apt-get install -y sudo \ - && rm -rf /var/lib/apt/lists/* -RUN echo "docker ALL=NOPASSWD: ALL" >> /etc/sudoers - -USER docker -WORKDIR /home/docker -RUN chown -R docker:docker /home/docker -ENV HOME /home/docker -ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH -RUN sudo /opt/conda/bin/conda install scipy numpy matplotlib #Test matplotlib -RUN /opt/conda/bin/python -c "import matplotlib" #Install General MPI, such that mpi4py can later bind with it. -WORKDIR /home/docker - -RUN \ - sudo wget https://www.open-mpi.org/software/ompi/v2.0/downloads/openmpi-2.0.0.tar.gz && \ - sudo tar -xzf openmpi-2.0.0.tar.gz && \ - sudo rm openmpi-2.0.0.tar.gz - -WORKDIR /home/docker/openmpi-2.0.0 - -# Compile openmpi -RUN \ - sudo ./configure && \ - sudo make all && \ - sudo make install - -# Get python bindings for open mpi -WORKDIR $HOME -RUN sudo /opt/conda/bin/conda install -y mpi4py ipython - +#WORKDIR $HOME #Install NEURON-7.4 with python, with MPI. An infamous build process, #and much of the motivation for this docker container -WORKDIR /home/docker/neuron # Fetch NEURON source files, extract them, delete .tar.gz file. -RUN \ - sudo wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.4/nrn-7.4.tar.gz && \ - sudo tar -xzf nrn-7.4.tar.gz && \ - sudo rm nrn-7.4.tar.gz - -WORKDIR /home/docker/neuron/nrn-7.4 -RUN sudo ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python --with-paranrn=/usr/bin/mpiexec -RUN sudo make all && \ - sudo make install #Create python bindings for NEURON -WORKDIR src/nrnpython -RUN sudo /opt/conda/bin/python setup.py install -ENV PATH $HOME/neuron/nrn-7.4/x86_64/bin:$PATH - - -#Get JNeuroML -RUN echo $PATH -WORKDIR /home/docker/git -#TODO change back to this repository, once pull request as accepted for python3 compliant code -#RUN sudo git clone https://github.com/NeuroML/jNeuroML -RUN sudo git clone https://github.com/russelljjarvis/jNeuroML.git -WORKDIR jNeuroML -RUN sudo /opt/conda/bin/python getNeuroML.py - -#Begin installation of neuronunit. - -WORKDIR /home/docker/git -RUN sudo git clone https://github.com/rgerkin/rickpy -WORKDIR /home/docker/git/rickpy -RUN sudo /opt/conda/bin/python setup.py install - +#WORKDIR src/nrnpython +#RUN sudo python setup.py install +#--with-nrnpython=/opt/conda/bin/python +RUN which mpirun +#RUN mpirun -np 4 nrniv -mpi $HOME/neuron/nrn-7.4/src/parallel/test1.hoc +#RUN /usr/bin/mpiexec -np 4 nrniv -mpi $HOME/neuron/nrn-7.4/src/parallel/test2.hoc +WORKDIR /home/docker +ENV HOME /home/docker +RUN echo 'rerun' WORKDIR $HOME -RUN sudo /opt/conda/bin/conda install -y tempita cython - -RUN sudo /opt/conda/bin/conda install -y libxml2 libxslt lxml -RUN sudo apt-get install -y gcc - -RUN sudo /opt/conda/bin/conda install -y jupyter - -#sciunit - -WORKDIR /home/docker/git -RUN sudo git clone https://github.com/scidash/sciunit -b dev -WORKDIR /home/docker/git/sciunit -RUN sudo /opt/conda/bin/python setup.py install +RUN \ + wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.4/nrn-7.4.tar.gz && \ + tar -xzf nrn-7.4.tar.gz && \ + rm nrn-7.4.tar.gz + +WORKDIR $HOME/nrn-7.4 +RUN whereis python3 +ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH +#RUN ls -ltr configure +RUN ./configure --prefix=`pwd` --with-paranrn --without-iv --with-nrnpython=/usr/bin/python3 +RUN make all && \ + make install +ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH -#neuronunit + +RUN useradd -ms /bin/bash docker +USER root +RUN apt-get update \ + && apt-get install -y sudo \ + && rm -rf /var/lib/apt/lists/* +RUN echo "docker ALL=NOPASSWD: ALL" >> /etc/sudoers -WORKDIR /home/docker/git -RUN sudo git clone https://github.com/scidash/neuronunit -b dev -WORKDIR /home/docker/git/neuronunit -RUN sudo /opt/conda/bin/python setup.py install -#TODO create a notebook web server without having a web browser or a graphical front end -#In the future code to do this will be based on: -#https://github.com/dmaticzka/docker-edenbase -#https://github.com/rgerkin/docker-edenbase -#Unsure if getting pip is still necessary. -RUN sudo apt-get update && sudo apt-get install -y python3-setuptools -RUN sudo apt-get install -y pandoc -RUN sudo easy_install3 pip - ENV HOME /home/docker +ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH -ENV PATH $HOME/neuron/nrn-7.4/x86_64/bin:$PATH - -RUN sudo chown -R docker $HOME - -WORKDIR /home/docker/git -RUN git clone https://github.com/soravux/scoop.git -WORKDIR /home/docker/git/scoop -RUN sudo /opt/conda/bin/python setup.py install - -WORKDIR /home/docker/git -RUN git clone https://github.com/DEAP/deap.git -WORKDIR /home/docker/git/deap -RUN sudo /opt/conda/bin/python setup.py install -#The volume command declares a volume of persistant memory for the docker container. -#This will be useful for ongoing development. -#VOLUME -# TODO uncomment and test: - -#WORKDIR /home/docker/git -#RUN git https://github.com/OpenSourceBrain/Thalamocortical.git -#WORKDIR /home/docker/git/Thalamocortical/NeuroML2/pythonScripts/netbuild/ -#RUN jNeuroML -neuron -netPyNN TestSmall.net.nml - -#Some superficial tests to check for breaks. -RUN nrniv -RUN mpiexec -np 4 python -c "import mpi4py" -RUN python -c "import neuron; import sciunit; import neuronunit" -RUN nrnivmodl -RUN echo "that last stderr may have looked bad, but it was probably an indication that nrnivmodl can work if given mod files" -RUN python -c "import scoop; import deap" +RUN apt-get update && apt-get install -y wget bzip2 ca-certificates \ + libglib2.0-0 libxext6 libsm6 libxrender1 \ + git gcc g++ build-essential \ + libncurses-dev openmpi-bin openmpi-doc libopenmpi-dev \ + default-jre default-jdk maven emacs -RUN sudo /opt/conda/bin/conda install matplotlib +WORKDIR $HOME/git +#TODO change back to this repository, once pull request as accepted for python3 compliant code +#RUN sudo git clone https://github.com/NeuroML/jNeuroML +RUN git clone https://github.com/russelljjarvis/jNeuroML.git +WORKDIR jNeuroML +RUN python getNeuroML.py -# Contact GitHub API Training Shop Blog About + +USER docker +RUN sudo chown -R docker:docker /home/docker +#WORKDIR $HOME/nrn-7.4/src/parallel +#RUN mpiexec -np 4 nrniv -mpi test0.hoc -# © 2016 GitHub, Inc. Terms Privacy Security Status Help From c59ccdce383ba0bcc9a01204a9b32c4d1dc7821d Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 19 Jun 2017 21:19:47 +1000 Subject: [PATCH 15/97] refactor Dockerbuild for optimization --- neuronunit-optimization/Dockerfile | 70 ++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index fbfeb50..05eddbb 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -12,7 +12,7 @@ USER root RUN apt-get update RUN apt-get install -y gvfs-bin libxss1 python3-setuptools RUN apt-get install -y python-tk curl apt-utils -#RUN apt-get install -y povray eog + RUN chown -R jovyan $HOME RUN chown -R jovyan /opt/conda/lib/python3.5/site-packages/ @@ -27,15 +27,22 @@ RUN pip install IPython \ ipyparallel \ enum34 RUN conda install mpi4py +##### Scoop ##### + RUN easy_install gevent RUN easy_install greenlet -##### Scoop ##### WORKDIR $HOME -RUN git clone https://github.com/soravux/scoop +RUN git clone https://github.com/russelljjarvis/scoop.git WORKDIR scoop RUN python setup.py install +##### DEAP ###### +WORKDIR $HOME +RUN git clone https://github.com/DEAP/deap.git +WORKDIR deap +RUN python setup.py install + ##### BluePyOpt ###### WORKDIR $HOME RUN git clone https://github.com/russelljjarvis/BluePyOpt.git @@ -51,18 +58,11 @@ RUN pip install git+https://github.com/roryk/ipython-cluster-helper # Must be done as root to create directories in /usr/local RUN sudo /opt/conda/bin/ipcluster nbextension enable -ENV PATH $PATH:/opt/conda/bin -ENV PATH $PATH:/opt/conda/bin/ipcluster -ENV PATH $PATH:/opt/conda/bin/ipython -ENV PATH $PATH:/opt/conda/bin/pip -ENV PATH $PATH:/opt/conda/bin/python -ENV PATH $PATH:/opt/conda/lib/python3.5/site-packages -ENV PATH $PATH:$PYTHONPATH - RUN printenv PATH RUN python -c "import pyneuroml" RUN python -c "import neuronunit" RUN python -c "from neuronunit.models.reduced import ReducedModel" +RUN conda install quantities RUN python -c "import quantities" RUN python -c "import neuron" RUN python -c "import pyneuroml" @@ -71,9 +71,53 @@ RUN python -c "import scoop" RUN python -c "import deap" RUN nrniv +RUN sudo /opt/conda/bin/pip install sphinx +RUN sudo git clone https://github.com/russelljjarvis/scoop.git +RUN sudo /opt/conda/bin/python setup.py install #RUN export PATH=$PATH -#un comment the following line to test ipcluster during build. +#uncomment the following line to test ipcluster during build. #RUN ipcluster start --profile=chase --debug & #https://github.com/russelljjarvis/neuronunit.git -WORKDIR $WORK_HOME \ No newline at end of file +WORKDIR $HOME +ENV PYTHONPATH $HOME/neuronunit:$PYTHONPATH +RUN if [ ! -d "$/home/jovyan/git/neuronunit" ]; then git clone -b dev https://github.com/russelljjarvis/neuronunit.git; fi +WORKDIR $HOME/neuronunit/neuronunit/tests/NeuroML2 + +RUN nrnivmodl +RUN ls LEMS_2007One.xml +WORKDIR $HOME/neuronunit/neuronunit/tests/ +RUN ls *.pickle + +WORKDIR /home/git +USER root +RUN chown -R $NB_USER . +USER $NB_USER + +RUN conda install plotly seaborn +RUN pip install prospector +WORKDIR /home/git/neuronunit +#RUN python -c "from prospector import run; run.main()" +#run.main() + +RUN sudo chown -R jovyan . + +RUN echo "import os">> run_ipp1.p + +#RUN echo "os.system('ipcluster start --profile=chase --debug &')" >> run_ipp1.py +#RUN echo "import ipyparallel as ipp ; rc = ipp.Client(profile='chase'); print('hello from before cpu '); print(rc.ids);" >> run_ipp2.py +#RUN ipython run_ipp1.py && sleep 15 && ipython run_ipp2.py +#RUN /opt/conda/bin/ipython3 -c "import sys; print(sys.path)" +#RUN /opt/conda/bin/ipython3 -c "import os; print(sys.path)" + + + +RUN echo "backend : Agg" >> /opt/conda/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc + +WORKDIR /home/mnt + +RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.system('ipcluster start --profile=chase --debug &')" +# /opt/conda/bin/python3 exhaustive_search.py +RUN sudo pip install -y NotebookTools +RUN conda install anaconda-client +WORKDIR $HOME/git From 8882bfecc5ff3800246cdb842069c728da45876f Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 19 Jun 2017 21:38:43 +1000 Subject: [PATCH 16/97] protection from merge by way of staging --- Dockerfile | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index 68df2ae..af65349 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ #author russell jarvis rjjarvis@asu.edu #NEURON Dockerfile #Set the base image to Ubuntu -FROM neuralensemble/simulation +FROM scidash/scipy-notebook-plus #Get a whole lot of GNU core development tools #version control java development, maven @@ -15,36 +15,32 @@ RUN apt-get update; apt-get install -y automake libtool git vim \ wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ python3-pip python3-numpy python3-scipy python3-matplotlib python3-mock \ ipython3 python3-docutils python3-yaml \ - python3-venv python3-mpi4py python3-tables cmake + python3-venv python3-mpi4py python3-tables cmake ssh #The following code is adapted from: #https://github.com/ContinuumIO/docker-images/blob/master/anaconda/Dockerfile -RUN echo 'export PATH=/opt/conda/bin:$PATH' > /etc/profile.d/conda.sh && \ - wget --quiet https://repo.continuum.io/miniconda/Miniconda3-3.7.0-Linux-x86_64.sh -O miniconda.sh -O ~/miniconda.sh && \ - /bin/bash ~/miniconda.sh -b -p /opt/conda && \ - rm ~/miniconda.sh #Do the rest of the build as user: #This will create a more familiar environment to continue developing in. #with less of a need to chown and chmod everything done as root at dockerbuild completion -RUN apt-get update \ - && apt-get install -y sudo \ - && rm -rf /var/lib/apt/lists/* -RUN echo "docker ALL=NOPASSWD: ALL" >> /etc/sudoers +#RUN apt-get update \ +# && apt-get install -y sudo \ +# && rm -rf /var/lib/apt/lists/* +#RUN echo "jovyan ALL=NOPASSWD: ALL" >> /etc/sudoers -USER docker -WORKDIR /home/docker -RUN sudo chown -R docker:docker /home/docker -ENV HOME /home/docker -ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH +USER jovyan +WORKDIR /home/jovyan +RUN sudo chown -R jovyan /home/jovyan +ENV HOME /home/jovyan +#ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH RUN sudo /opt/conda/bin/conda install scipy numpy matplotlib #Test matplotlib -RUN /opt/conda/bin/python -c "import matplotlib" +#RUN python -c "import matplotlib" #Install General MPI, such that mpi4py can later bind with it. -WORKDIR /home/docker +WORKDIR /home/jovyan WORKDIR $HOME RUN \ @@ -54,6 +50,7 @@ RUN \ WORKDIR $HOME/nrn-7.4 RUN whereis python3 +RUN which mpirun ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH #RUN ls -ltr configure RUN ./configure --prefix=`pwd` --with-paranrn --without-iv --with-nrnpython=/usr/bin/python3 @@ -69,6 +66,10 @@ ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH +USER jovyan + + + WORKDIR $HOME/git #TODO change back to this repository, once pull request as accepted for python3 compliant code @@ -77,10 +78,8 @@ RUN sudo git clone https://github.com/russelljjarvis/jNeuroML.git WORKDIR $HOME/git/jNeuroML RUN sudo python getNeuroML.py - -USER docker -RUN sudo chown -R docker:docker /home/docker -WORKDIR /home/docker/nrn-7.4/src/parallel +RUN sudo chown -R jovyan /home/jovyan +WORKDIR /home/jovyan/nrn-7.4/src/parallel RUN mpiexec -np 4 nrniv -mpi test0.hoc RUN mpiexec -np 4 nrniv -mpi test1.hoc RUN mpiexec -np 4 nrniv -mpi test2.hoc @@ -92,3 +91,13 @@ RUN mpiexec -np 4 nrniv -mpi test7.hoc ADD ./test_fixed.py /home/docker/nrn-7.4/src/parallel/ RUN mpiexec -np 4 nrniv -mpi -python test_fixed.py +RUN sudo pip3 install zmq +RUN sudo pip3 install packaging +RUN sudo pip3 install --upgrade pip#notebook +RUN sudo pip3 install notebook +RUN sudo pip3 install ipyparallel +RUN sudo ipcluster nbextension enable +RUN sudo ipython profile create chase +RUN ipcluster start -n 4 --engines=MPIEngineSetLauncher +#RUN sudo ipcluster start --profile=chase --debug & +RUN mpiexec -n 4 ipengine --mpi=mpi4py \ No newline at end of file From c9ceb4ce730fa4188108e8a1778847c4b6686215 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 19 Jun 2017 21:41:29 +1000 Subject: [PATCH 17/97] dev changes, integrating scidash into main/master --- neuron-mpi-neuroml-extra/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/neuron-mpi-neuroml-extra/Dockerfile b/neuron-mpi-neuroml-extra/Dockerfile index bc51d3e..c94a8ba 100644 --- a/neuron-mpi-neuroml-extra/Dockerfile +++ b/neuron-mpi-neuroml-extra/Dockerfile @@ -20,7 +20,6 @@ RUN mpiexec -np 4 nrniv -mpi test5.hoc RUN mpiexec -np 4 nrniv -mpi test6.hoc RUN mpiexec -np 4 nrniv -mpi test7.hoc ADD ./test_fixed.py /home/jovyan/nrn-7.4/src/parallel/ -ADD ./test_fixed2.py /home/jovyan/nrn-7.4/src/parallel/ RUN mpiexec -np 4 nrniv -mpi -python test_fixed.py From 4648d76ceddfecfb4adb3d6e1d6c661ac3432bb6 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 19 Jun 2017 21:55:20 +1000 Subject: [PATCH 18/97] refactored --- neuron-mpi-neuroml-extra/{test_fixed.py => test_parallel_hoc.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename neuron-mpi-neuroml-extra/{test_fixed.py => test_parallel_hoc.py} (100%) diff --git a/neuron-mpi-neuroml-extra/test_fixed.py b/neuron-mpi-neuroml-extra/test_parallel_hoc.py similarity index 100% rename from neuron-mpi-neuroml-extra/test_fixed.py rename to neuron-mpi-neuroml-extra/test_parallel_hoc.py From 94e7a53b984325004759c80a2cfa8090bf3f900f Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 19 Jun 2017 21:59:53 +1000 Subject: [PATCH 19/97] refactor --- neuron-mpi-neuroml-extra/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/neuron-mpi-neuroml-extra/Dockerfile b/neuron-mpi-neuroml-extra/Dockerfile index c94a8ba..74f3b2a 100644 --- a/neuron-mpi-neuroml-extra/Dockerfile +++ b/neuron-mpi-neuroml-extra/Dockerfile @@ -1,6 +1,6 @@ FROM scidash/neuron-mpi-neuroml -RUN /opt/conda/bin/ipython3 setup.py install +#RUN /opt/conda/bin/ipython3 setup.py install RUN /opt/conda/bin/ipython -c "from neuron import h" RUN /opt/conda/bin/ipython3 -c "from neuron import h" @@ -19,7 +19,7 @@ RUN mpiexec -np 4 nrniv -mpi test4.hoc RUN mpiexec -np 4 nrniv -mpi test5.hoc RUN mpiexec -np 4 nrniv -mpi test6.hoc RUN mpiexec -np 4 nrniv -mpi test7.hoc -ADD ./test_fixed.py /home/jovyan/nrn-7.4/src/parallel/ +ADD ./test_parallel_hoc.py /home/jovyan/nrn-7.4/src/parallel/ RUN mpiexec -np 4 nrniv -mpi -python test_fixed.py From 97d87daa424cdf45808982adf1e6c42076980435 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 28 Jun 2017 20:07:47 +1000 Subject: [PATCH 20/97] dev changes --- neuronunit-optimization/Dockerfile | 31 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 05eddbb..4eaca8c 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -33,10 +33,14 @@ RUN easy_install gevent RUN easy_install greenlet WORKDIR $HOME +RUN ls +#RUN sudo rm -r $HOME/scoop RUN git clone https://github.com/russelljjarvis/scoop.git -WORKDIR scoop -RUN python setup.py install +#RUN git clone https://github.com/russelljjarvis/scoop.git +WORKDIR $HOME/scoop +RUN python setup.py install +RUN /opt/conda/bin/python setup.py install ##### DEAP ###### WORKDIR $HOME RUN git clone https://github.com/DEAP/deap.git @@ -61,9 +65,9 @@ RUN sudo /opt/conda/bin/ipcluster nbextension enable RUN printenv PATH RUN python -c "import pyneuroml" RUN python -c "import neuronunit" -RUN python -c "from neuronunit.models.reduced import ReducedModel" -RUN conda install quantities -RUN python -c "import quantities" +#RUN python -c "from neuronunit.models.reduced import ReducedModel" +#RUN conda install quantities +#RUN python -c "import quantities" RUN python -c "import neuron" RUN python -c "import pyneuroml" RUN nrnivmodl @@ -72,8 +76,8 @@ RUN python -c "import deap" RUN nrniv RUN sudo /opt/conda/bin/pip install sphinx -RUN sudo git clone https://github.com/russelljjarvis/scoop.git -RUN sudo /opt/conda/bin/python setup.py install +#RUN sudo git clone https://github.com/russelljjarvis/scoop.git +#RUN sudo /opt/conda/bin/python setup.py install #RUN export PATH=$PATH #uncomment the following line to test ipcluster during build. @@ -81,7 +85,9 @@ RUN sudo /opt/conda/bin/python setup.py install #https://github.com/russelljjarvis/neuronunit.git WORKDIR $HOME ENV PYTHONPATH $HOME/neuronunit:$PYTHONPATH -RUN if [ ! -d "$/home/jovyan/git/neuronunit" ]; then git clone -b dev https://github.com/russelljjarvis/neuronunit.git; fi +#RUN if [ ! -d "$/home/jovyan/git/neuronunit" ]; then t; fi +RUN rm -r neuronunit +RUN git clone -b russell_dev https://github.com/russelljjarvis/neuronunit.git WORKDIR $HOME/neuronunit/neuronunit/tests/NeuroML2 RUN nrnivmodl @@ -118,6 +124,11 @@ WORKDIR /home/mnt RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.system('ipcluster start --profile=chase --debug &')" # /opt/conda/bin/python3 exhaustive_search.py -RUN sudo pip install -y NotebookTools +RUN sudo /opt/conda/bin/pip install NotebookTools RUN conda install anaconda-client -WORKDIR $HOME/git +#WORKDIR $HOME/git +WORKDIR $HOME/mnt +RUN ipython profile create +RUN sudo chown -R jovyan $HOME +#RUN ipython notebook --notebook-dir=/home/mnt +#RUN ipython -c "print(get_config())" \ No newline at end of file From eb9c4da1ee883dcd8fa6701198f17a5f52a3d2b2 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 28 Jun 2017 23:12:24 +1000 Subject: [PATCH 21/97] hacked quantities into working state --- neuronunit-optimization/Dockerfile | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 4eaca8c..ba0b54f 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -62,12 +62,20 @@ RUN pip install git+https://github.com/roryk/ipython-cluster-helper # Must be done as root to create directories in /usr/local RUN sudo /opt/conda/bin/ipcluster nbextension enable +#Use hack/patch discussed at end of thread until quantities truly becomes compatible with numpy +#https://www.bountysource.com/issues/46022410-valueerror-ufunc-ufunc-positive-not-supported-by-quantities + +RUN git clone -b "master" git://github.com/python-quantities/python-quantities.git +WORKDIR python-quantities +RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg +RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg +RUN python -c "import quantities" + RUN printenv PATH RUN python -c "import pyneuroml" RUN python -c "import neuronunit" -#RUN python -c "from neuronunit.models.reduced import ReducedModel" +RUN python -c "from neuronunit.models.reduced import ReducedModel" #RUN conda install quantities -#RUN python -c "import quantities" RUN python -c "import neuron" RUN python -c "import pyneuroml" RUN nrnivmodl @@ -121,7 +129,6 @@ RUN echo "import os">> run_ipp1.p RUN echo "backend : Agg" >> /opt/conda/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc WORKDIR /home/mnt - RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.system('ipcluster start --profile=chase --debug &')" # /opt/conda/bin/python3 exhaustive_search.py RUN sudo /opt/conda/bin/pip install NotebookTools From 80f2bf230bb35622a961a0571abbdeb2b10b7691 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 28 Jun 2017 23:30:31 +1000 Subject: [PATCH 22/97] run this docker stack for development --- neuronunit-optimization/run_opt_nb.sh | 1 + 1 file changed, 1 insertion(+) create mode 100644 neuronunit-optimization/run_opt_nb.sh diff --git a/neuronunit-optimization/run_opt_nb.sh b/neuronunit-optimization/run_opt_nb.sh new file mode 100644 index 0000000..8454735 --- /dev/null +++ b/neuronunit-optimization/run_opt_nb.sh @@ -0,0 +1 @@ +docker run -p 8888:8888 -v `pwd`:/home/jovyan/mnt scidash/neuronunit-optimization jupyter notebook --ip=0.0.0.0 --NotebookApp.token=\"\" --NotebookApp.disable_check_xsrf=True From 005b3581da3583e427decef74374f96c616325bf Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 28 Jun 2017 23:50:57 +1000 Subject: [PATCH 23/97] dev changes --- neuronunit-optimization/Dockerfile | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index ba0b54f..7e5187a 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -65,10 +65,13 @@ RUN sudo /opt/conda/bin/ipcluster nbextension enable #Use hack/patch discussed at end of thread until quantities truly becomes compatible with numpy #https://www.bountysource.com/issues/46022410-valueerror-ufunc-ufunc-positive-not-supported-by-quantities +RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg + RUN git clone -b "master" git://github.com/python-quantities/python-quantities.git WORKDIR python-quantities -RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg +RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities + RUN python -c "import quantities" RUN printenv PATH @@ -108,8 +111,8 @@ USER root RUN chown -R $NB_USER . USER $NB_USER -RUN conda install plotly seaborn -RUN pip install prospector +#RUN conda install plotly seaborn +#RUN pip install prospector WORKDIR /home/git/neuronunit #RUN python -c "from prospector import run; run.main()" #run.main() @@ -126,16 +129,12 @@ RUN echo "import os">> run_ipp1.p -RUN echo "backend : Agg" >> /opt/conda/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc +#RUN echo "backend : Agg" >> /opt/conda/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc -WORKDIR /home/mnt RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.system('ipcluster start --profile=chase --debug &')" # /opt/conda/bin/python3 exhaustive_search.py -RUN sudo /opt/conda/bin/pip install NotebookTools -RUN conda install anaconda-client -#WORKDIR $HOME/git +#RUN sudo /opt/conda/bin/pip install NotebookTools +#RUN conda install anaconda-client WORKDIR $HOME/mnt -RUN ipython profile create +#RUN ipython profile create RUN sudo chown -R jovyan $HOME -#RUN ipython notebook --notebook-dir=/home/mnt -#RUN ipython -c "print(get_config())" \ No newline at end of file From 0d6323ba4169dadb26d9d2c21e5ef5b2e5ab2b24 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 29 Jun 2017 10:22:58 +1000 Subject: [PATCH 24/97] dev changes --- build-all | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-all b/build-all index 85c39af..6d66c68 100755 --- a/build-all +++ b/build-all @@ -1,4 +1,4 @@ -for name in scipy-notebook-plus sciunit neuron-mpi-neuroml neuronunit neuronunit-openworm neuronunit-neuroconstruct neuronunit-optimization; do +for name in scipy-notebook-plus sciunit neuron-mpi-neuroml neuronunit neuronunit-optimization; do echo "********************************" echo "Building scidash/$name" echo "********************************" From db0de5192b9fc6b9a1fca1755812b4f58efd7fda Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 29 Jun 2017 14:34:16 +1000 Subject: [PATCH 25/97] dev changes --- neuronunit-optimization/Dockerfile | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 7e5187a..ea924e7 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -66,11 +66,14 @@ RUN sudo /opt/conda/bin/ipcluster nbextension enable #https://www.bountysource.com/issues/46022410-valueerror-ufunc-ufunc-positive-not-supported-by-quantities RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg - -RUN git clone -b "master" git://github.com/python-quantities/python-quantities.git -WORKDIR python-quantities -RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg -RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities +RUN /opt/conda/bin/pip install --upgrade git+git://github.com/python-quantities/python-quantities.git@master +RUN python -c "import quantities as pq" +RUN python -c "import sciunit.scores" + +#RUN git clone -b "master" git://github.com/python-quantities/python-quantities.git +#WORKDIR python-quantities +#RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg +#RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities RUN python -c "import quantities" From 1ef4e97cb942aa066e3200495d44917205a91fe8 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sun, 2 Jul 2017 15:12:52 +1000 Subject: [PATCH 26/97] dev changes --- neuronunit-optimization/Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index ea924e7..7a8e59f 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -62,6 +62,10 @@ RUN pip install git+https://github.com/roryk/ipython-cluster-helper # Must be done as root to create directories in /usr/local RUN sudo /opt/conda/bin/ipcluster nbextension enable +RUN jupyter nbextension install --sys-prefix --py ipyparallel +RUN jupyter nbextension enable --sys-prefix --py ipyparallel +RUN jupyter serverextension enable --sys-prefix --py ipyparallel + #Use hack/patch discussed at end of thread until quantities truly becomes compatible with numpy #https://www.bountysource.com/issues/46022410-valueerror-ufunc-ufunc-positive-not-supported-by-quantities @@ -89,7 +93,7 @@ RUN python -c "import scoop" RUN python -c "import deap" RUN nrniv -RUN sudo /opt/conda/bin/pip install sphinx +#RUN sudo /opt/conda/bin/pip install sphinx #RUN sudo git clone https://github.com/russelljjarvis/scoop.git #RUN sudo /opt/conda/bin/python setup.py install #RUN export PATH=$PATH From d2550248fae7af82bdfb5a2ae0f512b4ac042a64 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 5 Jul 2017 12:29:46 +1000 Subject: [PATCH 27/97] documentation, move to trunk documentation --- neuronunit-optimization/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 neuronunit-optimization/README.md diff --git a/neuronunit-optimization/README.md b/neuronunit-optimization/README.md new file mode 100644 index 0000000..c618734 --- /dev/null +++ b/neuronunit-optimization/README.md @@ -0,0 +1,15 @@ + + +https://github.com/krallin/tini + +NOTE: If you are using Docker 1.13 or greater, Tini is included in Docker itself. This includes all versions of Docker CE. To enable Tini, just pass the --init flag to docker run. + +Why tini? (init backwards) + +Using Tini has several benefits: + +It protects you from software that accidentally creates zombie processes, which can (over time!) starve your entire system for PIDs (and make it unusable). +It ensures that the default signal handlers work for the software you run in your Docker image. For example, with Tini, SIGTERM properly terminates your process even if you didn't explicitly install a signal handler for it. +It does so completely transparently! Docker images that work without Tini will work with Tini without any changes. +If you'd like more detail on why this is useful, review this issue discussion: What is advantage of Tini?. + From de650859b501de7d126056798e7c43a6c7c52909 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 5 Jul 2017 14:32:49 +1000 Subject: [PATCH 28/97] added to doc --- README.md | 16 ++++++++++++++++ neuronunit-optimization/README.md | 1 + 2 files changed, 17 insertions(+) diff --git a/README.md b/README.md index 6cd6f62..d958b26 100644 --- a/README.md +++ b/README.md @@ -77,3 +77,19 @@ c.DockerSpawner.extra_create_kwargs.update({ }) ``` Then run `jupyterhub`, visit the indicated URL (e.g. `10.200.11.1:8000`) in your browser, and log in as a system user. + +Ipython Parallel seems to benefit from tini + +https://github.com/krallin/tini + +NOTE: If you are using Docker 1.13 or greater, Tini is included in Docker itself. This includes all versions of Docker CE. To enable Tini, just pass the --init flag to docker run. + +Why tini? (init backwards) + +Using Tini has several benefits: + +It protects you from software that accidentally creates zombie processes, which can (over time!) starve your entire system for PIDs (and make it unusable). +It ensures that the default signal handlers work for the software you run in your Docker image. For example, with Tini, SIGTERM properly terminates your process even if you didn't explicitly install a signal handler for it. +It does so completely transparently! Docker images that work without Tini will work with Tini without any changes. +If you'd like more detail on why this is useful, review this issue discussion: What is advantage of Tini?. + diff --git a/neuronunit-optimization/README.md b/neuronunit-optimization/README.md index c618734..c1d36a2 100644 --- a/neuronunit-optimization/README.md +++ b/neuronunit-optimization/README.md @@ -1,4 +1,5 @@ +Ipython Parallel seems to benefit from tini https://github.com/krallin/tini From 95b4f8e9886e51c3875c795e97d66fe8cf6e793b Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 15 Jul 2017 20:45:30 +1000 Subject: [PATCH 29/97] dev changes to docker file --- neuronunit-optimization/Dockerfile | 31 ++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 7a8e59f..a60fda9 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -14,8 +14,8 @@ RUN apt-get install -y gvfs-bin libxss1 python3-setuptools RUN apt-get install -y python-tk curl apt-utils -RUN chown -R jovyan $HOME -RUN chown -R jovyan /opt/conda/lib/python3.5/site-packages/ +#RUN sudo chown -R jovyan $HOME +#RUN sudo chown -R jovyan /opt/conda/lib/python3.5/site-packages/ USER $NB_USER RUN pip install --upgrade pip @@ -25,7 +25,11 @@ RUN pip install IPython \ notebook \ ipykernel \ ipyparallel \ - enum34 + enum34 \ + bqplot \ + numba + +#numba is for optimized code, bqplot is for interactive plotting. RUN conda install mpi4py ##### Scoop ##### @@ -54,6 +58,12 @@ WORKDIR BluePyOpt RUN python setup.py install RUN python -c "import bluepyopt" +##### Replace PyNeuroML ########## +WORKDIR $HOME +RUN git clone https://github.com/NeuroML/pyNeuroML.git +RUN pyneuroml +RUN python setup.py install + ##### IPython Cluster ##### USER $NB_USER WORKDIR $HOME @@ -113,8 +123,14 @@ RUN ls LEMS_2007One.xml WORKDIR $HOME/neuronunit/neuronunit/tests/ RUN ls *.pickle -WORKDIR /home/git -USER root +#WORKDIR /home/git +#USER root +#ENV TINI_VERSION v0.15.0 +#ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini +#RUN chmod +x /tini + +RUN /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz + RUN chown -R $NB_USER . USER $NB_USER @@ -128,7 +144,7 @@ RUN sudo chown -R jovyan . RUN echo "import os">> run_ipp1.p -#RUN echo "os.system('ipcluster start --profile=chase --debug &')" >> run_ipp1.py +#RUN echo "os.system('ipcluster start --profile=default')" >> run_ipp1.py #RUN echo "import ipyparallel as ipp ; rc = ipp.Client(profile='chase'); print('hello from before cpu '); print(rc.ids);" >> run_ipp2.py #RUN ipython run_ipp1.py && sleep 15 && ipython run_ipp2.py #RUN /opt/conda/bin/ipython3 -c "import sys; print(sys.path)" @@ -145,3 +161,6 @@ RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.sy WORKDIR $HOME/mnt #RUN ipython profile create RUN sudo chown -R jovyan $HOME +# Add Tini + + From 005c99205b9aaa7406dd0a1238467baff1490c00 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 19 Jul 2017 15:28:32 +1000 Subject: [PATCH 30/97] dev changes --- neuronunit-optimization/Dockerfile | 2 +- neuronunit-optimization/run_opt_nb.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 7a8e59f..7837cfc 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -104,7 +104,7 @@ RUN nrniv WORKDIR $HOME ENV PYTHONPATH $HOME/neuronunit:$PYTHONPATH #RUN if [ ! -d "$/home/jovyan/git/neuronunit" ]; then t; fi -RUN rm -r neuronunit + RUN git clone -b russell_dev https://github.com/russelljjarvis/neuronunit.git WORKDIR $HOME/neuronunit/neuronunit/tests/NeuroML2 diff --git a/neuronunit-optimization/run_opt_nb.sh b/neuronunit-optimization/run_opt_nb.sh index 8454735..852e2f7 100644 --- a/neuronunit-optimization/run_opt_nb.sh +++ b/neuronunit-optimization/run_opt_nb.sh @@ -1 +1 @@ -docker run -p 8888:8888 -v `pwd`:/home/jovyan/mnt scidash/neuronunit-optimization jupyter notebook --ip=0.0.0.0 --NotebookApp.token=\"\" --NotebookApp.disable_check_xsrf=True +docker run -p 8888:8888 -v `pwd`:/home/jovyan/mnt pnp jupyter notebook --ip=0.0.0.0 --NotebookApp.token=\"\" --NotebookApp.disable_check_xsrf=True From a7524eb6a9082790c6c4cfb920111a1b1b7526b9 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 19 Jul 2017 18:28:35 +1000 Subject: [PATCH 31/97] graphviz --- neuronunit-optimization/Dockerfile | 37 ++++++++---------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index a60fda9..e71aebb 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -61,8 +61,14 @@ RUN python -c "import bluepyopt" ##### Replace PyNeuroML ########## WORKDIR $HOME RUN git clone https://github.com/NeuroML/pyNeuroML.git -RUN pyneuroml -RUN python setup.py install +RUN pwd +RUN ls -ltr * +WORKDIR pyNeuroML +#WORKDIR pyneuroml +#WORKDIR $HOME/PyNeuroML +RUN ls *.py +RUN ls setup.py +RUN sudo /opt/conda/bin/python setup.py install ##### IPython Cluster ##### USER $NB_USER @@ -90,7 +96,6 @@ RUN python -c "import sciunit.scores" #RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities RUN python -c "import quantities" - RUN printenv PATH RUN python -c "import pyneuroml" RUN python -c "import neuronunit" @@ -123,44 +128,22 @@ RUN ls LEMS_2007One.xml WORKDIR $HOME/neuronunit/neuronunit/tests/ RUN ls *.pickle -#WORKDIR /home/git -#USER root -#ENV TINI_VERSION v0.15.0 -#ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini -#RUN chmod +x /tini +RUN pip install --upgrade neo RUN /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz +RUN conda install python-graphviz graphviz RUN chown -R $NB_USER . USER $NB_USER -#RUN conda install plotly seaborn -#RUN pip install prospector WORKDIR /home/git/neuronunit -#RUN python -c "from prospector import run; run.main()" -#run.main() RUN sudo chown -R jovyan . RUN echo "import os">> run_ipp1.p -#RUN echo "os.system('ipcluster start --profile=default')" >> run_ipp1.py -#RUN echo "import ipyparallel as ipp ; rc = ipp.Client(profile='chase'); print('hello from before cpu '); print(rc.ids);" >> run_ipp2.py -#RUN ipython run_ipp1.py && sleep 15 && ipython run_ipp2.py -#RUN /opt/conda/bin/ipython3 -c "import sys; print(sys.path)" -#RUN /opt/conda/bin/ipython3 -c "import os; print(sys.path)" - - - -#RUN echo "backend : Agg" >> /opt/conda/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc - RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.system('ipcluster start --profile=chase --debug &')" -# /opt/conda/bin/python3 exhaustive_search.py -#RUN sudo /opt/conda/bin/pip install NotebookTools -#RUN conda install anaconda-client WORKDIR $HOME/mnt -#RUN ipython profile create RUN sudo chown -R jovyan $HOME -# Add Tini From 26420c77f68f8f6ce210c4a0e083cde6ad0c6523 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 19 Jul 2017 18:32:02 +1000 Subject: [PATCH 32/97] graphviz --- neuronunit-optimization/Dockerfile | 6 ------ 1 file changed, 6 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 53d1e9a..b68f4ae 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -118,15 +118,9 @@ RUN nrniv #https://github.com/russelljjarvis/neuronunit.git WORKDIR $HOME ENV PYTHONPATH $HOME/neuronunit:$PYTHONPATH -#RUN if [ ! -d "$/home/jovyan/git/neuronunit" ]; then t; fi - -RUN git clone -b russell_dev https://github.com/russelljjarvis/neuronunit.git -WORKDIR $HOME/neuronunit/neuronunit/tests/NeuroML2 RUN nrnivmodl -RUN ls LEMS_2007One.xml WORKDIR $HOME/neuronunit/neuronunit/tests/ -RUN ls *.pickle RUN pip install --upgrade neo From 86511b398f90a3d731275e979727c47b9fe2f39f Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 19 Jul 2017 18:33:10 +1000 Subject: [PATCH 33/97] dev changes --- neuronunit-optimization/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 7837cfc..b1c289f 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -112,7 +112,7 @@ RUN nrnivmodl RUN ls LEMS_2007One.xml WORKDIR $HOME/neuronunit/neuronunit/tests/ RUN ls *.pickle - +RUN conda install python-graphviz graphviz WORKDIR /home/git USER root RUN chown -R $NB_USER . @@ -124,6 +124,7 @@ WORKDIR /home/git/neuronunit #RUN python -c "from prospector import run; run.main()" #run.main() + RUN sudo chown -R jovyan . RUN echo "import os">> run_ipp1.p From d6df5e120538737a0ccb1b7556e4fb46641f2a1f Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 19 Jul 2017 19:27:41 +1000 Subject: [PATCH 34/97] dev changes --- neuronunit-optimization/Dockerfile | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index b68f4ae..40d34c3 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -124,8 +124,6 @@ WORKDIR $HOME/neuronunit/neuronunit/tests/ RUN pip install --upgrade neo -RUN /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz -RUN conda install python-graphviz graphviz RUN chown -R $NB_USER . USER $NB_USER @@ -141,3 +139,17 @@ WORKDIR $HOME/mnt RUN sudo chown -R jovyan $HOME + +RUN sudo apt-get update +RUN sudo apt-get install -qq gdebi wget libgd2-xpm-dev make +RUN sudo wget -O $HOME/graphviz-2.38.0.deb http://www.graphviz.org/pub/graphviz/stable/ubuntu/ub12.04/x86_64/graphviz_2.38.0-1~precise_amd64.deb +RUN sudo wget -O $HOME/libgraphviz4.deb \ + http://www.graphviz.org/pub/graphviz/stable/ubuntu/ub12.04/x86_64/libgraphviz4_2.38.0-1~precise_amd64.deb +# RUN apt-get remove libcdt4 libpathplan4 libxdot4 +# RUN sudo wget -O libgd-xpm.deb http://security.ubuntu.com/ubuntu/pool/main/libg/libgd2/libgd2-xpm_2.0.36~rc1~dfsg-6ubuntu2.1_amd64.deb +# RUN sudo dpkg -i libgd-xpm.deb && apt-get install -f +# RUN sudo yes | gdebi $HOME/libgraphviz4.deb +# RUN sudo yes | gdebi $HOME/graphviz-2.38.0.deb +RUN sudo /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz +RUN conda install python-graphviz graphviz +RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" \ No newline at end of file From 53b7b84f3ad6d648d514ffe0ec261544f50a0f5a Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 19 Jul 2017 19:54:02 +1000 Subject: [PATCH 35/97] dev changes --- neuronunit-optimization/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 40d34c3..96acb36 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -152,4 +152,5 @@ RUN sudo wget -O $HOME/libgraphviz4.deb \ # RUN sudo yes | gdebi $HOME/graphviz-2.38.0.deb RUN sudo /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz RUN conda install python-graphviz graphviz -RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" \ No newline at end of file +RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" +RUN conda install plotly \ No newline at end of file From cd7c68af6b2722705e2d7d61151f08c65549f645 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 20 Jul 2017 12:19:52 +1000 Subject: [PATCH 36/97] dev to rebuild --- neuronunit-optimization/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 96acb36..72bf228 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -153,4 +153,4 @@ RUN sudo wget -O $HOME/libgraphviz4.deb \ RUN sudo /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz RUN conda install python-graphviz graphviz RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" -RUN conda install plotly \ No newline at end of file +RUN conda install plotly igraph From dda3a40c9da925b8016007b6dcb92776c3e73179 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 20 Jul 2017 18:12:33 +1000 Subject: [PATCH 37/97] dev changes --- neuronunit-optimization/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 72bf228..6dcfc65 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -153,4 +153,7 @@ RUN sudo wget -O $HOME/libgraphviz4.deb \ RUN sudo /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz RUN conda install python-graphviz graphviz RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" -RUN conda install plotly igraph +RUN conda install plotly python-igraph +# Note igraph as distinguished from python-igraph is actually jgraph, something else entirely +RUN sudo apt-get install python-dev graphviz libgraphviz-dev pkg-config +RUN pip install git+https://github.com/pygraphviz/pygraphviz.git \ No newline at end of file From 8c85880a2f869bacd340070782e046803e7018bc Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 20 Jul 2017 18:14:44 +1000 Subject: [PATCH 38/97] dev changes --- neuronunit-optimization/Dockerfile | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index eb1b1a6..e20d1f5 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -29,7 +29,7 @@ RUN pip install IPython \ ipykernel \ ipyparallel \ enum34 \ - bqplot \ + bqplot \ numba #numba is for optimized code, bqplot is for interactive plotting. @@ -137,10 +137,8 @@ RUN sudo chown -R jovyan $HOME - -RUN conda install python-graphviz graphviz -RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" -RUN conda install plotly python-igraph +# RUN conda install python-graphviz graphviz # Note igraph as distinguished from python-igraph is actually jgraph, something else entirely -RUN sudo apt-get install python-dev graphviz libgraphviz-dev pkg-config -RUN pip install git+https://github.com/pygraphviz/pygraphviz.git \ No newline at end of file +RUN sudo apt-get install -y python-dev graphviz libgraphviz-dev pkg-config +RUN pip install git+https://github.com/pygraphviz/pygraphviz.git +RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" From 859eb7a91f029c8275502480e6ad74b08bd54ddd Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 21 Jul 2017 15:00:59 +1000 Subject: [PATCH 39/97] dev changes --- neuronunit-optimization/Dockerfile | 7 ++----- neuronunit/Dockerfile | 3 ++- scipy-notebook-plus/Dockerfile | 1 + 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index e20d1f5..774c857 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -64,14 +64,11 @@ RUN python -c "import bluepyopt" ##### Replace PyNeuroML ########## WORKDIR $HOME RUN git clone https://github.com/NeuroML/pyNeuroML.git -RUN pwd -RUN ls -ltr * WORKDIR pyNeuroML -#WORKDIR pyneuroml -#WORKDIR $HOME/PyNeuroML RUN ls *.py RUN ls setup.py -RUN sudo /opt/conda/bin/python setup.py install +RUN pip install --process-dependency-links -e . +#RUN sudo /opt/conda/bin/python setup.py install ##### IPython Cluster ##### USER $NB_USER diff --git a/neuronunit/Dockerfile b/neuronunit/Dockerfile index 0d26fd0..22cf4db 100644 --- a/neuronunit/Dockerfile +++ b/neuronunit/Dockerfile @@ -10,7 +10,8 @@ ARG HEAD=1 WORKDIR $HOME RUN git clone -b dev https://github.com/scidash/neuronunit.git WORKDIR neuronunit -RUN sudo /opt/conda/bin/python setup.py install +RUN pip install --process-dependency-links -e . +#RUN sudo /opt/conda/bin/python setup.py install WORKDIR $WORK_DIR # Put the optional local working copy (not the one we just cloned) # on the working path. diff --git a/scipy-notebook-plus/Dockerfile b/scipy-notebook-plus/Dockerfile index c65f814..eee5ee5 100644 --- a/scipy-notebook-plus/Dockerfile +++ b/scipy-notebook-plus/Dockerfile @@ -13,6 +13,7 @@ RUN chown -R $NB_USER $HOME #Libraries required for building NEURON from source RUN apt-get update +RUN apt-get -y install apt-transport-https curl RUN apt-get install -y wget bzip2 ca-certificates \ libglib2.0-0 libxext6 libsm6 libxrender1 \ git gcc g++ build-essential \ From f626d7cdd61dd694c1746c8ead674feedf9102d2 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 21 Jul 2017 15:05:01 +1000 Subject: [PATCH 40/97] dev changes --- sciunit/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/sciunit/Dockerfile b/sciunit/Dockerfile index 2ef7475..3e8fe69 100644 --- a/sciunit/Dockerfile +++ b/sciunit/Dockerfile @@ -7,6 +7,7 @@ FROM scidash/scipy-notebook-plus # HEAD, which will ensure that if the HEAD has changed (i.e. new commits), # then a new tar of the repo will be downloaded. ARG HEAD=1 +RUN sudo apt-get update RUN sudo apt-get install -y apt-transport-https WORKDIR $HOME From 365008530bec58a16fe2f1328712e680ee7cab74 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sun, 23 Jul 2017 18:56:22 +1000 Subject: [PATCH 41/97] dev changes --- neuronunit-optimization/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 6dcfc65..268ff69 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -78,6 +78,8 @@ RUN pip install git+https://github.com/roryk/ipython-cluster-helper # Must be done as root to create directories in /usr/local RUN sudo /opt/conda/bin/ipcluster nbextension enable +RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/gprof2dot.git + RUN jupyter nbextension install --sys-prefix --py ipyparallel RUN jupyter nbextension enable --sys-prefix --py ipyparallel RUN jupyter serverextension enable --sys-prefix --py ipyparallel From d9bdf06cabf3c61625a26c28962e3d6cf1ddde3f Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sun, 30 Jul 2017 18:24:44 +1000 Subject: [PATCH 42/97] dev changes --- scipy-notebook-plus/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/scipy-notebook-plus/Dockerfile b/scipy-notebook-plus/Dockerfile index eee5ee5..8e55fd6 100644 --- a/scipy-notebook-plus/Dockerfile +++ b/scipy-notebook-plus/Dockerfile @@ -13,6 +13,7 @@ RUN chown -R $NB_USER $HOME #Libraries required for building NEURON from source RUN apt-get update +RUN apt-get install apt-transport-https ca-certificates RUN apt-get -y install apt-transport-https curl RUN apt-get install -y wget bzip2 ca-certificates \ libglib2.0-0 libxext6 libsm6 libxrender1 \ From d634ab01439d27d914fb9b29878e974aca8cedf9 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 11:29:48 +1000 Subject: [PATCH 43/97] commiting a docker build such as to facilitate reproduction of a minimal working example --- reproduce_error/Dockerfile | 15 +++++++++++++++ reproduce_error/Dockerfile~ | 15 +++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 reproduce_error/Dockerfile create mode 100644 reproduce_error/Dockerfile~ diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile new file mode 100644 index 0000000..7ab3936 --- /dev/null +++ b/reproduce_error/Dockerfile @@ -0,0 +1,15 @@ +# author Russell Jarvis rjjarvis@asu.edu +# author Rick Gerkin rgerkin@asu.edu +# neuronunit-showcase + +FROM scidash/neuronunit-optimization +RUN echo "get it again 1" +RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git +WORKDIR informatics_poster/neuronunit/optimization +#~/mnt/new/informatics_poster/neuronunit/optimization + +#RUN ipython -i -c "import os;os.system('ipcluster start -n 8 --profile=default &');import nsga_parallel_no_vm" +ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default &');time.sleep(10);import nsga_parallel_no_vm" + +#ipython -i nsga_parallel_no_vm.py + diff --git a/reproduce_error/Dockerfile~ b/reproduce_error/Dockerfile~ new file mode 100644 index 0000000..b226dbb --- /dev/null +++ b/reproduce_error/Dockerfile~ @@ -0,0 +1,15 @@ +# author Russell Jarvis rjjarvis@asu.edu +# author Rick Gerkin rgerkin@asu.edu +# neuronunit-showcase + +FROM scidash/neuronunit-optimization +RUN echo "get it again" +RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git +WORKDIR informatics_poster/neuronunit/optimization +#~/mnt/new/informatics_poster/neuronunit/optimization + +#RUN ipython -i -c "import os;os.system('ipcluster start -n 8 --profile=default &');import nsga_parallel_no_vm" +ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default &');time.sleep(10);import nsga_parallel_no_vm" + +#ipython -i nsga_parallel_no_vm.py + From 6926b06be31b5d99cf28fda6d20bdd7cb3a8188b Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 11:33:11 +1000 Subject: [PATCH 44/97] Update Dockerfile --- reproduce_error/Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile index 7ab3936..40992b5 100644 --- a/reproduce_error/Dockerfile +++ b/reproduce_error/Dockerfile @@ -3,13 +3,9 @@ # neuronunit-showcase FROM scidash/neuronunit-optimization -RUN echo "get it again 1" RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git WORKDIR informatics_poster/neuronunit/optimization -#~/mnt/new/informatics_poster/neuronunit/optimization -#RUN ipython -i -c "import os;os.system('ipcluster start -n 8 --profile=default &');import nsga_parallel_no_vm" ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default &');time.sleep(10);import nsga_parallel_no_vm" -#ipython -i nsga_parallel_no_vm.py From 9451a73fcb3e76c582281470bc020103165b6e89 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 11:33:22 +1000 Subject: [PATCH 45/97] Update Dockerfile --- reproduce_error/Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile index 40992b5..ca68aa4 100644 --- a/reproduce_error/Dockerfile +++ b/reproduce_error/Dockerfile @@ -1,6 +1,4 @@ -# author Russell Jarvis rjjarvis@asu.edu -# author Rick Gerkin rgerkin@asu.edu -# neuronunit-showcase + FROM scidash/neuronunit-optimization RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git From 48c34029ac597a7bf3f296c86ba4c70712de83d0 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 11:35:40 +1000 Subject: [PATCH 46/97] Update Dockerfile --- reproduce_error/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile index ca68aa4..d125e11 100644 --- a/reproduce_error/Dockerfile +++ b/reproduce_error/Dockerfile @@ -4,6 +4,6 @@ FROM scidash/neuronunit-optimization RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git WORKDIR informatics_poster/neuronunit/optimization -ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default &');time.sleep(10);import nsga_parallel_no_vm" +ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default');time.sleep(10);import nsga_parallel_no_vm" From 0c703747e787c930e6ccfbb2e1a7480ef0c8e166 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 11:37:59 +1000 Subject: [PATCH 47/97] Update Dockerfile --- reproduce_error/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile index d125e11..7dd9345 100644 --- a/reproduce_error/Dockerfile +++ b/reproduce_error/Dockerfile @@ -4,6 +4,6 @@ FROM scidash/neuronunit-optimization RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git WORKDIR informatics_poster/neuronunit/optimization -ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default');time.sleep(10);import nsga_parallel_no_vm" +ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default');time.sleep(4);import nsga_parallel_no_vm" From f1bf95f47374a92d5b842bbf6e0bfe1f0d26b734 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 11:47:11 +1000 Subject: [PATCH 48/97] Update Dockerfile --- reproduce_error/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile index 7dd9345..71ec85a 100644 --- a/reproduce_error/Dockerfile +++ b/reproduce_error/Dockerfile @@ -4,6 +4,7 @@ FROM scidash/neuronunit-optimization RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git WORKDIR informatics_poster/neuronunit/optimization -ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default');time.sleep(4);import nsga_parallel_no_vm" +CMD ipcluster start -n 8 --profile=default & +ENTRYPOINT ipython -i nsga_parallel_no_vm.py From a49c2ef6dc39d72d1f263df7798b9726692c6f64 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 12:22:37 +1000 Subject: [PATCH 49/97] dev changes --- reproduce_error/Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile index 7dd9345..fc5f65c 100644 --- a/reproduce_error/Dockerfile +++ b/reproduce_error/Dockerfile @@ -1,9 +1,12 @@ FROM scidash/neuronunit-optimization +RUN echo "redo clone 2" RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git WORKDIR informatics_poster/neuronunit/optimization - -ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default');time.sleep(4);import nsga_parallel_no_vm" +WORKDIR NeuroML2 +RUN nrnivmodl +WORKDIR informatics_poster/neuronunit/optimization +ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 5 && ipython -i nsga_parallel_no_vm.py From 87b1dc83c9bb66726d0fca62d602619d2257697b Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 12:36:06 +1000 Subject: [PATCH 50/97] dev changes --- reproduce_error/Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile index 8bbbe31..491932e 100644 --- a/reproduce_error/Dockerfile +++ b/reproduce_error/Dockerfile @@ -2,10 +2,9 @@ FROM scidash/neuronunit-optimization RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git +RUN sudo chown -R jovyan $HOME WORKDIR informatics_poster/neuronunit/optimization -WORKDIR NeuroML2 -RUN nrnivmodl -WORKDIR informatics_poster/neuronunit/optimization +RUN nrnivmodl NeuroML2 ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 5 && ipython -i nsga_parallel_no_vm.py From 677dae93b2d48e9178fdfde1c12f20803d3dcf71 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 5 Aug 2017 12:37:22 +1000 Subject: [PATCH 51/97] Delete Dockerfile~ --- reproduce_error/Dockerfile~ | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 reproduce_error/Dockerfile~ diff --git a/reproduce_error/Dockerfile~ b/reproduce_error/Dockerfile~ deleted file mode 100644 index b226dbb..0000000 --- a/reproduce_error/Dockerfile~ +++ /dev/null @@ -1,15 +0,0 @@ -# author Russell Jarvis rjjarvis@asu.edu -# author Rick Gerkin rgerkin@asu.edu -# neuronunit-showcase - -FROM scidash/neuronunit-optimization -RUN echo "get it again" -RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git -WORKDIR informatics_poster/neuronunit/optimization -#~/mnt/new/informatics_poster/neuronunit/optimization - -#RUN ipython -i -c "import os;os.system('ipcluster start -n 8 --profile=default &');import nsga_parallel_no_vm" -ENTRYPOINT ipython -i -c "import os,time;os.system('ipcluster start -n 8 --profile=default &');time.sleep(10);import nsga_parallel_no_vm" - -#ipython -i nsga_parallel_no_vm.py - From 12fe44a11193c530f01a0f677624d92954249282 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Tue, 8 Aug 2017 19:06:59 +1000 Subject: [PATCH 52/97] added in a file that facilitates automated running of the optimizer in a way that also lands you in a monkey pathch interactive mode, if the program chokes --- autoload/Dockerfile | 20 ++++++++++++++++++++ neuronunit-optimization/Dockerfile | 28 +++++++++++----------------- 2 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 autoload/Dockerfile diff --git a/autoload/Dockerfile b/autoload/Dockerfile new file mode 100644 index 0000000..ab1cc77 --- /dev/null +++ b/autoload/Dockerfile @@ -0,0 +1,20 @@ +### +## A file that is expected to be available after a volume is mounted +## cannot by executed using the entrypoint command, since +## Entry point acts on files that do exist +## Instead write a BASH script +## That merely assumes this path will +## become available at start up +## and execute it from its expected path on the mounted volume +## After building this file I launch docker with the alias al +## docker build autoload -t scidash/autoload +## alias al='cd ~/scratch;sudo docker run -e DISPLAY=$DISPLAY -it -v `pwd`:/home/mnt -v ${HOME}/git/.git \ +## -v /tmp/.X11-unix:/tmp/.X11-unix \ +## scidash/autoload' +### +FROM scidash/neuronunit-optimization +RUN sudo /opt/conda/bin/pip install cufflinks +RUN touch start.sh +RUN echo "cd /home/mnt/neuronunit/neuronunit/optimization" >> start.sh +RUN echo "ipcluster start -n 8 --profile=default & sleep 5 && ipython -i nsga_parallel.py" >> start.sh +ENTRYPOINT /bin/bash start.sh diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 774c857..5d025e4 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -12,7 +12,8 @@ USER root -RUN apt-get update +#RUN apt-get update +#RUN apt-get install -y apt-transport-https# ca-certificates RUN apt-get install -y gvfs-bin libxss1 python3-setuptools RUN apt-get install -y python-tk curl apt-utils @@ -20,7 +21,6 @@ RUN apt-get install -y python-tk curl apt-utils #RUN sudo chown -R jovyan $HOME #RUN sudo chown -R jovyan /opt/conda/lib/python3.5/site-packages/ -USER $NB_USER RUN pip install --upgrade pip RUN pip install -U matplotlib RUN pip install IPython \ @@ -39,15 +39,6 @@ RUN conda install mpi4py RUN easy_install gevent RUN easy_install greenlet -WORKDIR $HOME -RUN ls -#RUN sudo rm -r $HOME/scoop -RUN git clone https://github.com/russelljjarvis/scoop.git -#RUN git clone https://github.com/russelljjarvis/scoop.git - -WORKDIR $HOME/scoop -RUN python setup.py install -RUN /opt/conda/bin/python setup.py install ##### DEAP ###### WORKDIR $HOME RUN git clone https://github.com/DEAP/deap.git @@ -82,9 +73,6 @@ RUN jupyter nbextension install --sys-prefix --py ipyparallel RUN jupyter nbextension enable --sys-prefix --py ipyparallel RUN jupyter serverextension enable --sys-prefix --py ipyparallel -#Use hack/patch discussed at end of thread until quantities truly becomes compatible with numpy -#https://www.bountysource.com/issues/46022410-valueerror-ufunc-ufunc-positive-not-supported-by-quantities - RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg RUN /opt/conda/bin/pip install --upgrade git+git://github.com/python-quantities/python-quantities.git@master RUN python -c "import quantities as pq" @@ -132,10 +120,16 @@ RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.sy WORKDIR $HOME/mnt RUN sudo chown -R jovyan $HOME - - +#USER root +RUN sudo cat /etc/apt/sources.list # RUN conda install python-graphviz graphviz # Note igraph as distinguished from python-igraph is actually jgraph, something else entirely +RUN sudo apt-get update RUN sudo apt-get install -y python-dev graphviz libgraphviz-dev pkg-config -RUN pip install git+https://github.com/pygraphviz/pygraphviz.git +RUN sudo /opt/conda/bin/pip install git+https://github.com/pygraphviz/pygraphviz.git RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" + +RUN sudo /opt/conda/bin/pip install plotly + +WORKDIR $HOME +RUN python -c "import sciunit" From fde02ef90d50f278f4a76461e71e1d67082f7541 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Tue, 8 Aug 2017 19:08:48 +1000 Subject: [PATCH 53/97] dev changes and merge complete --- neuronunit-optimization/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index db53595..4b3bd79 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -131,7 +131,7 @@ RUN sudo apt-get install -y python-dev graphviz libgraphviz-dev pkg-config RUN sudo /opt/conda/bin/pip install git+https://github.com/pygraphviz/pygraphviz.git RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" -RUN sudo /opt/conda/bin/pip install plotly +RUN sudo /opt/conda/bin/pip install plotly cufflinks WORKDIR $HOME RUN python -c "import sciunit" From 036cf1f44c80e54da58d9389042ad5543463e8c1 Mon Sep 17 00:00:00 2001 From: Richard C Gerkin Date: Thu, 10 Aug 2017 14:45:53 -0700 Subject: [PATCH 54/97] Dockerfile reflects scidash/docker-stacks builds --- reproduce_error/Dockerfile | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile index 491932e..1fccfe5 100644 --- a/reproduce_error/Dockerfile +++ b/reproduce_error/Dockerfile @@ -1,10 +1,17 @@ - - FROM scidash/neuronunit-optimization -RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git -RUN sudo chown -R jovyan $HOME -WORKDIR informatics_poster/neuronunit/optimization + +WORKDIR /home/jovyan/mnt +USER root +RUN sudo chown -R jovyan /opt/conda +USER jovyan +RUN rm -rf /opt/conda/lib/python3.5/site-packages/*allensdk* +RUN pip install --process-dependency-links git+https://github.com/rgerkin/AllenSDK +#RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git +COPY /informatics_poster /home/jovyan/mnt/informatics_poster +RUN sudo chown -R jovyan /home/jovyan/mnt/informatics_poster +WORKDIR /home/jovyan/mnt/informatics_poster/neuronunit/optimization RUN nrnivmodl NeuroML2 +ENV QT_QPA_PLATFORM offscreen +ENV PYTHONPATH $PYTHONPATH:/home/jovyan/mnt/informatics_poster/neuronunit/optimization ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 5 && ipython -i nsga_parallel_no_vm.py - From b74b5a1ff74f174bd909bf037a84df338d53311a Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 31 Aug 2017 20:46:05 -0700 Subject: [PATCH 55/97] commiting so HEAD in dockerfile senses the rebuild --- build-all | 2 +- sciunit/Dockerfile | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/build-all b/build-all index dbe0321..a0a379e 100755 --- a/build-all +++ b/build-all @@ -1,4 +1,4 @@ -for stack in scipy-notebook-plus sciunit neuron-mpi-neuroml neuronunit neuronunit-showcase; do +for stack in scipy-notebook-plus sciunit neuron-mpi-neuroml neuronunit neuronunit-optimization autoload; do if [[ $stack == *unit ]]; then # If the value of HEAD has changed, meaning there have been new commits to the dev branch, # the build will be sure to download a new tar of the repo. Otherwise, it will use the cached version diff --git a/sciunit/Dockerfile b/sciunit/Dockerfile index 255952b..4c65a49 100644 --- a/sciunit/Dockerfile +++ b/sciunit/Dockerfile @@ -11,10 +11,13 @@ USER $NB_USER # HEAD, which will ensure that if the HEAD has changed (i.e. new commits), # then a new tar of the repo will be downloaded. ARG HEAD=1 +#RUN pip install git+https://github.com/NeuroML/pyNeuroML --process-dependency-links +#RUN pip install git+https://github.com/AllenInstitute/AllenSDK@py34_rgerkin --process-dependency-links + RUN wget http://github.com/scidash/sciunit/tarball/dev -O sciunit.tar.gz RUN mkdir -p sciunit RUN tar -xvzf sciunit.tar.gz -C sciunit --strip-components=1 WORKDIR sciunit -RUN python setup.py install +RUN python setup.py install --process-dependency-links -e RUN python test_all.py -WORKDIR $HOME/$WORKDIR \ No newline at end of file +WORKDIR $HOME/$WORKDIR From 444df28f318fb2977b73d5e5e7b1587dd8fb73d2 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 2 Sep 2017 18:32:49 -0700 Subject: [PATCH 56/97] dev changes --- autoload/Dockerfile | 28 ++++++++++++++++++++++++++++ sciunit/Dockerfile | 15 ++++++++++++--- 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 autoload/Dockerfile diff --git a/autoload/Dockerfile b/autoload/Dockerfile new file mode 100644 index 0000000..aa0fae4 --- /dev/null +++ b/autoload/Dockerfile @@ -0,0 +1,28 @@ +### +## A file that is expected to be available after a volume is mounted +## cannot by executed using the entrypoint command, since +## Entry point acts on files that do exist +## Instead write a BASH script +## That merely assumes this path will +## become available at start up +## and execute it from its expected path on the mounted volume +## After building this file I launch docker with the alias al +## docker build autoload -t scidash/autoload +## alias al='cd ~/scratch;sudo docker run -e DISPLAY=$DISPLAY -it -v `pwd`:/home/mnt -v ${HOME}/git/.git \ +## -v /tmp/.X11-unix:/tmp/.X11-unix \ +## scidash/autoload' +### +FROM scidash/neuronunit-optimization +RUN sudo /opt/conda/bin/pip install --upgrade networkx +RUN sudo /opt/conda/bin/pip install cufflinks +#RUN python -c "import net_graph" +RUN touch start.sh +RUN echo "cd /home/mnt/neuronunit/neuronunit/optimization" >> start.sh +RUN echo "ipcluster start -n 8 --profile=default & sleep 5 && ipython -i nsga_parallel.py" >> start.sh +RUN echo "ipcluster start -n 8 --profile=default & sleep 5 && ipython -i recovery.py" >> recovery.sh +RUN echo "alias st='/bin/bash start.sh'" +RUN echo "alias rec='/bin/bash recovery.sh'" +#ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 2 & + +#ENTRYPOINT /bin/bash start.sh +WORDIR $HOME \ No newline at end of file diff --git a/sciunit/Dockerfile b/sciunit/Dockerfile index 4c65a49..a446844 100644 --- a/sciunit/Dockerfile +++ b/sciunit/Dockerfile @@ -15,9 +15,18 @@ ARG HEAD=1 #RUN pip install git+https://github.com/AllenInstitute/AllenSDK@py34_rgerkin --process-dependency-links RUN wget http://github.com/scidash/sciunit/tarball/dev -O sciunit.tar.gz -RUN mkdir -p sciunit -RUN tar -xvzf sciunit.tar.gz -C sciunit --strip-components=1 +#RUN mkdir -p sciunit +#RUN tar -xvzf sciunit.tar.gz -C sciunit --strip-components=1 +#RUN pip install --process-dependency-links -e sciunit.tar.gz + +RUN git clone -b dev http://github.com/scidash/sciunit.git + WORKDIR sciunit -RUN python setup.py install --process-dependency-links -e +RUN ls +RUN python setup.py install +#RUN pip install -e git+http://github.com/scidash/sciunit.git@dev + +#RUN /opt/conda/bin/pip setup.py install --process-dependency-links -e + RUN python test_all.py WORKDIR $HOME/$WORKDIR From 21f8a362c7b5d10e0fee477f1d25429b9989573a Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 2 Sep 2017 18:33:08 -0700 Subject: [PATCH 57/97] dev changes --- neuronunit-optimization/Dockerfile | 154 +++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 neuronunit-optimization/Dockerfile diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile new file mode 100644 index 0000000..21dedcf --- /dev/null +++ b/neuronunit-optimization/Dockerfile @@ -0,0 +1,154 @@ +# author Russell Jarvis rjjarvis@asu.edu +# author Rick Gerkin rgerkin@asu.edu +# neuronunit-showcase + +FROM scidash/neuronunit + +################# +# Showcase for model optimization using NeuronUnit. +################# +USER root + + + + +#RUN apt-get update +#RUN apt-get install -y apt-transport-https# ca-certificates +RUN apt-get install -y gvfs-bin libxss1 python3-setuptools +RUN apt-get install -y python-tk curl apt-utils + + +#RUN sudo chown -R jovyan $HOME +#RUN sudo chown -R jovyan /opt/conda/lib/python3.5/site-packages/ + +RUN pip install --upgrade pip +RUN pip install -U matplotlib +RUN pip install IPython \ + jupyterhub \ + notebook \ + ipykernel \ + ipyparallel \ + enum34 \ + bqplot \ + numba + +#numba is for optimized code, bqplot is for interactive plotting. +RUN conda install mpi4py +##### Scoop ##### + +RUN easy_install gevent +RUN easy_install greenlet + +##### DEAP ###### +WORKDIR $HOME +RUN git clone https://github.com/DEAP/deap.git +WORKDIR deap +RUN python setup.py install + +##### BluePyOpt ###### +WORKDIR $HOME +RUN git clone https://github.com/russelljjarvis/BluePyOpt.git +WORKDIR BluePyOpt +RUN python setup.py install +RUN python -c "import bluepyopt" + +##### Replace PyNeuroML ########## +WORKDIR $HOME +RUN git clone https://github.com/NeuroML/pyNeuroML.git +WORKDIR pyNeuroML +RUN ls *.py +RUN ls setup.py +RUN pip install --process-dependency-links -e . +#RUN sudo /opt/conda/bin/python setup.py install + +##### IPython Cluster ##### +USER $NB_USER +WORKDIR $HOME +RUN ipython profile create default +RUN pip install git+https://github.com/roryk/ipython-cluster-helper +# Must be done as root to create directories in /usr/local +RUN sudo /opt/conda/bin/ipcluster nbextension enable + +RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/gprof2dot.git + +RUN jupyter nbextension install --sys-prefix --py ipyparallel +RUN jupyter nbextension enable --sys-prefix --py ipyparallel +RUN jupyter serverextension enable --sys-prefix --py ipyparallel + +RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg +RUN /opt/conda/bin/pip install --upgrade git+git://github.com/python-quantities/python-quantities.git@master +RUN python -c "import quantities as pq" +RUN python -c "import sciunit.scores" + +#RUN git clone -b "master" git://github.com/python-quantities/python-quantities.git +#WORKDIR python-quantities +#RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg +#RUN sudo ln -s quantities /opt/conda/lib/python3.5/site-packages/quantities + +RUN python -c "import quantities" +RUN printenv PATH +RUN python -c "import pyneuroml" +RUN python -c "import neuronunit" +RUN python -c "from neuronunit.models.reduced import ReducedModel" +#RUN conda install quantities +RUN python -c "import neuron" +RUN python -c "import pyneuroml" +RUN nrnivmodl +RUN python -c "import scoop" +RUN python -c "import deap" +RUN nrniv +WORKDIR $HOME +ENV PYTHONPATH $HOME/neuronunit:$PYTHONPATH + +RUN nrnivmodl +WORKDIR $HOME/neuronunit/neuronunit/tests/ +RUN sudo /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz +RUN pip install --upgrade neo + +RUN /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz +RUN conda install python-graphviz graphviz +WORKDIR /home/git +USER root +RUN chown -R $NB_USER . +USER $NB_USER + +WORKDIR /home/git/neuronunit + +RUN sudo chown -R jovyan . + +RUN echo "import os">> run_ipp1.p + +RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.system('ipcluster start --profile=chase --debug &')" + +WORKDIR $HOME +RUN sudo chown -R jovyan $HOME + +#USER root +RUN sudo cat /etc/apt/sources.list +# RUN conda install python-graphviz graphviz +# Note igraph as distinguished from python-igraph is actually jgraph, something else entirely + +RUN sudo apt-get update +RUN sudo apt-get install -y python-dev graphviz libgraphviz-dev pkg-config +RUN sudo /opt/conda/bin/pip install git+https://github.com/pygraphviz/pygraphviz.git +RUN python -c "from networkx.drawing.nx_agraph import graphviz_layout" + +RUN sudo /opt/conda/bin/pip install plotly cufflinks + + +RUN sudo rm -r sciunit +RUN sudo /opt/conda/bin/pip install --process-dependency-links git+https://github.com/scidash/sciunit.git@dev +#RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev +RUN git clone -b dev https://github.com/scidash/sciunit.git +WORKDIR sciunit/sciunit +RUN grep -rn "unpicklable" __init__.py +#RUN sudo /opt/conda/bin/python setup.py install +#WORKDIR $HOME +#RUN python -c "import sciunit; "unpicklable" in dir(sciunit.Test)" +RUN python -c "import sys; print(sys.path)" +#RUN sudo rm /opt/conda/lib/python3.5/site-packages/sciunit-0.1.5.8-py3.5.egg/sciunit/__init__.py + +#RUN sudo cp -r /home/jovyan/sciunit /opt/conda/lib/python3.5/site-packages/sciunit-0.1.5.8-py3.5.egg/sciunit +#RUN sudo ln -s /home/jovyan/sciunit/__init__.py /opt/conda/lib/python3.5/site-packages/sciunit-0.1.5.8-py3.5.egg/sciunit/__init__.py +RUN python -c "import sciunit; print(sciunit.__file__)" + From 7960d688378e9acab54944b20624774605b82736 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 2 Sep 2017 19:08:26 -0700 Subject: [PATCH 58/97] added in autoload --- autoload/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/Dockerfile b/autoload/Dockerfile index aa0fae4..60c1866 100644 --- a/autoload/Dockerfile +++ b/autoload/Dockerfile @@ -25,4 +25,4 @@ RUN echo "alias rec='/bin/bash recovery.sh'" #ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 2 & #ENTRYPOINT /bin/bash start.sh -WORDIR $HOME \ No newline at end of file +WORKDIR $HOME \ No newline at end of file From 455b832a6ba406fe37fe416710b0869e2c7a23b7 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 9 Sep 2017 18:13:45 -0700 Subject: [PATCH 59/97] for building issue94 --- issue94/Dockerfile | 34 ++++++++++++++++++++++++++++++++++ issue94/neuronunit | 1 + 2 files changed, 35 insertions(+) create mode 100644 issue94/Dockerfile create mode 160000 issue94/neuronunit diff --git a/issue94/Dockerfile b/issue94/Dockerfile new file mode 100644 index 0000000..41051fa --- /dev/null +++ b/issue94/Dockerfile @@ -0,0 +1,34 @@ +FROM scidash/neuronunit-optimization + +WORKDIR /home/jovyan/mnt +USER root +RUN sudo chown -R jovyan /opt/conda +USER jovyan +RUN rm -rf /opt/conda/lib/python3.5/site-packages/*allensdk* +RUN pip install --process-dependency-links git+https://github.com/rgerkin/AllenSDK +#RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git + +RUN sudo chown -R jovyan /home/jovyan/mnt + +#WORKDIR /home/jovyan/mnt +#RUN git clone -b issue94 https://github.com/scidash/neuronunit.git + +#This is informed by Rick's actual code: + + +COPY neuronunit /home/jovyan/mnt/neuronunit + + +WORKDIR /home/jovyan/mnt/neuronunit/neuronunit/optimization/NeuroML2 +RUN sudo chown -R jovyan /home/jovyan/mnt + +RUN nrnivmodl +WORKDIR /home/jovyan/mnt/neuronunit/neuronunit/optimization +ENV QT_QPA_PLATFORM offscreen +ENV PYTHONPATH $PYTHONPATH:/home/jovyan/mnt/neuronunit/neuronunit/optimization +ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 5 & /bin/bash + + + + + diff --git a/issue94/neuronunit b/issue94/neuronunit new file mode 160000 index 0000000..b5e1e12 --- /dev/null +++ b/issue94/neuronunit @@ -0,0 +1 @@ +Subproject commit b5e1e12fb42b84acb8006d7fca40a4fa9a1b9356 From b98787380b46af3f477ccff8baf8bd248326cfd7 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 15 Sep 2017 15:16:28 -0700 Subject: [PATCH 60/97] moved shell into run, as shell is all I want, I don't want default run --- issue94/Dockerfile | 38 +++++++++++++++++++++++++++++++------- issue94/func2rc.sh | 10 ++++++++++ run | 17 +++-------------- 3 files changed, 44 insertions(+), 21 deletions(-) create mode 100644 issue94/func2rc.sh diff --git a/issue94/Dockerfile b/issue94/Dockerfile index 41051fa..ea5ebbc 100644 --- a/issue94/Dockerfile +++ b/issue94/Dockerfile @@ -9,24 +9,48 @@ RUN pip install --process-dependency-links git+https://github.com/rgerkin/AllenS #RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git RUN sudo chown -R jovyan /home/jovyan/mnt +RUN sudo /opt/conda/bin/pip install psutil -#WORKDIR /home/jovyan/mnt -#RUN git clone -b issue94 https://github.com/scidash/neuronunit.git +WORKDIR /home/jovyan/work +RUN git clone -b dev https://github.com/rgerkin/informatics_poster.git +RUN cp -r informatics_poster neuronunit +# https://github.com/rgerkin/informatics_poster.git #This is informed by Rick's actual code: +COPY stdout_worker.py /home/jovyan/work/neuronunit/neuronunit/optimization -COPY neuronunit /home/jovyan/mnt/neuronunit +#COPY neuronunit /home/jovyan/mnt/neuronunit - -WORKDIR /home/jovyan/mnt/neuronunit/neuronunit/optimization/NeuroML2 +#/home/jovyan/work/neuronunit +WORKDIR /home/jovyan/work/neuronunit/neuronunit/optimization +WORKDIR /home/jovyan/work/neuronunit/neuronunit/optimization/NeuroML2 +#/neuronunit/optimization/NeuroML2 RUN sudo chown -R jovyan /home/jovyan/mnt RUN nrnivmodl -WORKDIR /home/jovyan/mnt/neuronunit/neuronunit/optimization +#WORKDIR /home/jovyan/mnt/neuronunit/neuronunit/optimization +WORKDIR $HOME/work/special/stable/neuronunit/optimization ENV QT_QPA_PLATFORM offscreen + ENV PYTHONPATH $PYTHONPATH:/home/jovyan/mnt/neuronunit/neuronunit/optimization -ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 5 & /bin/bash + + + +COPY func2rc.sh ~/ +RUN cat ~/func2rc.sh >> ~/.bashrc + +#RUN echo "function sc(){" >> ~/.bashrc +#RUN echo "echo $1" >> ~/.bashrc +#RUN echo "echo `pwd`" >> ~/.bashrc +#RUN echo "export IPYTHONDIR=$1" >> ~/.bashrc +#RUN echo "ipcluster start -n 8 --profile=default --workdir=$1 &" >> ~/.bashrc +#RUN echo "sleep 5" >> ~/.bashrc +#RUN echo "python stdout_worker.py &" >> ~/.bashrc +#RUN echo "}" >> ~/.bashrc +#RUN echo "sc='export IPYTHONDIR=`pwd`;ipcluster start -n 8 --profile=default --workdir=`pwd` & sleep 5; python stdout_worker.py &'" >> ~/.bashrc + +#ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 5 & /bin/bash & ipython stdout_worker.py & diff --git a/issue94/func2rc.sh b/issue94/func2rc.sh new file mode 100644 index 0000000..a66912e --- /dev/null +++ b/issue94/func2rc.sh @@ -0,0 +1,10 @@ + + +function sc(){ + echo $1 + echo `pwd` + export IPYTHONDIR=$1 + ipcluster start -n 8 --profile=default --workdir=$1 & + sleep 5 + python stdout_worker.py & +} diff --git a/run b/run index 2f689df..3ed978c 100755 --- a/run +++ b/run @@ -1,22 +1,11 @@ -#!/bin/bash -NAME=$1 -if ! [ $NOTEBOOK_HOME ]; then - NOTEBOOK_HOME=$HOME -fi WORK_HOME=/home/jovyan/work -ENTRYPOINT=jupyter-notebook -ENTRYPOINT_ARGS="--ip=0.0.0.0 --NotebookApp.token=\"\" --NotebookApp.disable_check_xsrf=True" -HOST_PORT=8887 # Open port on the host machine. +ENTRYPOINT=/bin/bash if [ "$2" = "-dev" ]; then docker run -it --entrypoint=$ENTRYPOINT \ -v $SCIDASH_HOME/sciunit:$WORK_HOME/sciunit \ -v $SCIDASH_HOME/neuronunit:$WORK_HOME/neuronunit \ - -p $HOST_PORT:8888 -v $NOTEBOOK_HOME:$WORK_HOME \ - scidash/$NAME $ENTRYPOINT_ARGS + scidash/$1 else - docker run -it --entrypoint=$ENTRYPOINT \ - -p $HOST_PORT:8888 -v $NOTEBOOK_HOME:$WORK_HOME \ - scidash/$NAME $ENTRYPOINT_ARGS + docker run -it --entrypoint=$ENTRYPOINT scidash/$1 fi -# Now access the notebook server at http://localhost:$HOST_PORT \ No newline at end of file From e0dca40265f2b82c94b3f839d09857d53bb787b5 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sun, 17 Sep 2017 21:22:08 -0700 Subject: [PATCH 61/97] dev changes --- neuronunit-optimization/Dockerfile | 35 +++++++--- neuronunit-optimization/func2rc.sh | 18 +++++ neuronunit-optimization/stdout_worker.py | 86 ++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 9 deletions(-) create mode 100644 neuronunit-optimization/func2rc.sh create mode 100644 neuronunit-optimization/stdout_worker.py diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 4b3bd79..d70a7b7 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -28,12 +28,12 @@ RUN pip install IPython \ notebook \ ipykernel \ ipyparallel \ - enum34 \ - bqplot \ - numba + enum34 + +RUN pip install bqplot numba #numba is for optimized code, bqplot is for interactive plotting. -RUN conda install mpi4py +#RUN conda install mpi4py ##### Scoop ##### RUN easy_install gevent @@ -45,12 +45,20 @@ RUN git clone https://github.com/DEAP/deap.git WORKDIR deap RUN python setup.py install +RUN apt-get update && \ + apt-get -y install gcc +RUN apt-get autoremove +RUN apt-get upgrade +RUN sudo apt-get -y install python-dev ##### BluePyOpt ###### -WORKDIR $HOME -RUN git clone https://github.com/russelljjarvis/BluePyOpt.git -WORKDIR BluePyOpt -RUN python setup.py install -RUN python -c "import bluepyopt" +#WORKDIR $HOME +#RUN git clone https://github.com/russelljjarvis/BluePyOpt.git +#WORKDIR BluePyOpt +#RUN python setup.py install +#RUN python -c "import bluepyopt" + + +RUN /opt/conda/bin/pip install mpi4py ##### Replace PyNeuroML ########## WORKDIR $HOME @@ -135,3 +143,12 @@ RUN sudo /opt/conda/bin/pip install plotly cufflinks WORKDIR $HOME RUN python -c "import sciunit" + +COPY stdout_worker.py $HOME/stdout_worker.py +COPY func2rc.sh $HOME/func2rc.sh +RUN cat $HOME/func2rc.sh >> ~/.bashrc +RUN sudo chown -R jovyan /home/jovyan/work +ENV QT_QPA_PLATFORM offscreen +ENV PYTHONPATH $PYTHONPATH/home/jovyan/neuronunit/neuronunit/optimization +RUN /bin/bash -c "source $HOME/func2rc.sh" +WORKDIR $HOME/neuronunit/neuronunit diff --git a/neuronunit-optimization/func2rc.sh b/neuronunit-optimization/func2rc.sh new file mode 100644 index 0000000..e6e19e6 --- /dev/null +++ b/neuronunit-optimization/func2rc.sh @@ -0,0 +1,18 @@ + + +function sc(){ + export PYTHONPATH=$1 + ipcluster start -n 8 --profile=default & + sleep 5 + python stdout_worker.py & + ipython -i nsga_parallel.py + # explanation + # there is some ugly inconsistencies between the + # controller and the engines on ipyparallel + # basically the controllers fixed location of neuronunit is fixed to /home/jovyan/work/neuronunit/neuronunit + # this probably + # because PYTHONPATH was set to this early with ENV + # this is very static and it can't be updated + #ln -s "`$1`../../neuronunit /home/jovyan/work/neuronunit/neuronunit" +} + diff --git a/neuronunit-optimization/stdout_worker.py b/neuronunit-optimization/stdout_worker.py new file mode 100644 index 0000000..595043c --- /dev/null +++ b/neuronunit-optimization/stdout_worker.py @@ -0,0 +1,86 @@ +"""A script for watching all traffic on the IOPub channel (stdout/stderr/pyerr) of engines. + +This connects to the default cluster, or you can pass the path to your ipcontroller-client.json + +Try running this script, and then running a few jobs that print (and call sys.stdout.flush), +and you will see the print statements as they arrive, notably not waiting for the results +to finish. + +You can use the zeromq SUBSCRIBE mechanism to only receive information from specific engines, +and easily filter by message type. + +Authors +------- +* MinRK +""" + +import sys +import json +import zmq + +from jupyter_client.session import Session +from ipykernel.connect import find_connection_file + +def main(connection_file): + """watch iopub channel, and print messages""" + + ctx = zmq.Context.instance() + + with open(connection_file) as f: + cfg = json.loads(f.read()) + + reg_url = cfg['interface'] + iopub_port = cfg['iopub'] + iopub_url = "%s:%s"%(reg_url, iopub_port) + + session = Session(key=cfg['key'].encode('ascii')) + sub = ctx.socket(zmq.SUB) + + # This will subscribe to all messages: + sub.SUBSCRIBE = b'' + # replace with b'' with b'engine.1.stdout' to subscribe only to engine 1's stdout + # 0MQ subscriptions are simple 'foo*' matches, so 'engine.1.' subscribes + # to everything from engine 1, but there is no way to subscribe to + # just stdout from everyone. + # multiple calls to subscribe will add subscriptions, e.g. to subscribe to + # engine 1's stderr and engine 2's stdout: + # sub.SUBSCRIBE = b'engine.1.stderr' + # sub.SUBSCRIBE = b'engine.2.stdout' + sub.connect(iopub_url) + while True: + try: + idents,msg = session.recv(sub, mode=0) + except KeyboardInterrupt: + return + # ident always length 1 here + topic = idents[0].decode('utf8', 'replace') + if msg['msg_type'] == 'stream': + # stdout/stderr + # stream names are in msg['content']['name'], if you want to handle + # them differently + print("%s: %s" % (topic, msg['content']['text'])) + elif msg['msg_type'] == 'error': + # Python traceback + c = msg['content'] + print(topic + ':') + for line in c['traceback']: + # indent lines + print(' ' + line) + elif msg['msg_type'] == 'error': + # Python traceback + c = msg['content'] + print(topic + ':') + for line in c['traceback']: + # indent lines + print(' ' + line) + +if __name__ == '__main__': + if len(sys.argv) > 1: + pattern = sys.argv[1] + else: + # This gets the security file for the default profile: + pattern = 'ipcontroller-client.json' + cf = find_connection_file(pattern) + print("Using connection file %s" % cf) + main(cf) + #import nsga_parallel From 1610426f9b8978feac7c27cb6e1f2adc5ed73219 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 18 Sep 2017 08:10:44 -0700 Subject: [PATCH 62/97] dev changes --- issue94/Dockerfile | 19 +++---------------- issue94/func2rc.sh | 9 +++++++++ scipy-notebook-plus/Dockerfile | 2 +- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/issue94/Dockerfile b/issue94/Dockerfile index ea5ebbc..d1e4fb2 100644 --- a/issue94/Dockerfile +++ b/issue94/Dockerfile @@ -33,25 +33,12 @@ RUN nrnivmodl WORKDIR $HOME/work/special/stable/neuronunit/optimization ENV QT_QPA_PLATFORM offscreen -ENV PYTHONPATH $PYTHONPATH:/home/jovyan/mnt/neuronunit/neuronunit/optimization +ENV PYTHONPATH /home/jovyan/mnt/neuronunit/neuronunit/optimization -COPY func2rc.sh ~/ -RUN cat ~/func2rc.sh >> ~/.bashrc - -#RUN echo "function sc(){" >> ~/.bashrc -#RUN echo "echo $1" >> ~/.bashrc -#RUN echo "echo `pwd`" >> ~/.bashrc -#RUN echo "export IPYTHONDIR=$1" >> ~/.bashrc -#RUN echo "ipcluster start -n 8 --profile=default --workdir=$1 &" >> ~/.bashrc -#RUN echo "sleep 5" >> ~/.bashrc -#RUN echo "python stdout_worker.py &" >> ~/.bashrc -#RUN echo "}" >> ~/.bashrc -#RUN echo "sc='export IPYTHONDIR=`pwd`;ipcluster start -n 8 --profile=default --workdir=`pwd` & sleep 5; python stdout_worker.py &'" >> ~/.bashrc - -#ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 5 & /bin/bash & ipython stdout_worker.py & - +COPY func2rc.sh $HOME/func2rc.sh +RUN cat $HOME/func2rc.sh >> $HOME/.bashrc diff --git a/issue94/func2rc.sh b/issue94/func2rc.sh index a66912e..c1a701e 100644 --- a/issue94/func2rc.sh +++ b/issue94/func2rc.sh @@ -7,4 +7,13 @@ function sc(){ ipcluster start -n 8 --profile=default --workdir=$1 & sleep 5 python stdout_worker.py & + # explanation + # there is some ugly inconsistencies between the + # controller and the engines on ipyparallel + # basically the controllers fixed location of neuronunit is fixed to /home/jovyan/work/neuronunit/neuronunit + # this probably + # because PYTHONPATH was set to this early with ENV + # this is very static and it can't be updated + ln -s "`$1`../../neuronunit /home/jovyan/work/neuronunit/neuronunit" } + diff --git a/scipy-notebook-plus/Dockerfile b/scipy-notebook-plus/Dockerfile index 8e55fd6..d9a9b76 100644 --- a/scipy-notebook-plus/Dockerfile +++ b/scipy-notebook-plus/Dockerfile @@ -13,7 +13,7 @@ RUN chown -R $NB_USER $HOME #Libraries required for building NEURON from source RUN apt-get update -RUN apt-get install apt-transport-https ca-certificates +RUN apt-get -y install apt-transport-https ca-certificates RUN apt-get -y install apt-transport-https curl RUN apt-get install -y wget bzip2 ca-certificates \ libglib2.0-0 libxext6 libsm6 libxrender1 \ From 6535f6c183c8501b4ffbedb5d7f60f6a1b37ca76 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Tue, 19 Sep 2017 16:07:31 -0700 Subject: [PATCH 63/97] dev changes --- Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 826888e..2bd2c07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -103,4 +103,8 @@ RUN sudo ipcluster nbextension enable RUN sudo ipython profile create chase RUN ipcluster start -n 4 --engines=MPIEngineSetLauncher #RUN sudo ipcluster start --profile=chase --debug & -RUN mpiexec -n 4 ipengine --mpi=mpi4py \ No newline at end of file +RUN mpiexec -n 4 ipengine --mpi=mpi4py + +RUN sudo chown -R jovyan /home/jovyan/work +ENV QT_QPA_PLATFORM offscreen +ENV PYTHONPATH $PYTHONPATH/home/jovyan/work/neuronunit/neuronunit/optimization From 8ea26274315bd81b4e543883d6d4325d096bed0d Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Tue, 19 Sep 2017 17:09:34 -0700 Subject: [PATCH 64/97] dev changes --- neuronunit-optimization/Dockerfile | 39 ++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index d70a7b7..5a9b9f9 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -9,12 +9,16 @@ FROM scidash/neuronunit ################# USER root - - - -#RUN apt-get update +RUN apt-get update --fix-missing +RUN apt-get -y upgrade +RUN apt-get dist-upgrade +RUN apt-get update && \ + apt-get -y install gcc && \ + rm -rf /var/lib/apt/lists/* +RUN apt-get autoremove -y +RUN apt-get -y update #RUN apt-get install -y apt-transport-https# ca-certificates -RUN apt-get install -y gvfs-bin libxss1 python3-setuptools +RUN apt-get install -y python3-setuptools RUN apt-get install -y python-tk curl apt-utils @@ -42,7 +46,8 @@ RUN easy_install greenlet ##### DEAP ###### WORKDIR $HOME RUN git clone https://github.com/DEAP/deap.git -WORKDIR deap +#https://github.com/DEAP/deap.git +WORKDIR $HOME/deap RUN python setup.py install RUN apt-get update && \ @@ -83,7 +88,7 @@ RUN jupyter nbextension install --sys-prefix --py ipyparallel RUN jupyter nbextension enable --sys-prefix --py ipyparallel RUN jupyter serverextension enable --sys-prefix --py ipyparallel -RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg +#RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/quantities-0.11.1-py3.5.egg RUN /opt/conda/bin/pip install --upgrade git+git://github.com/python-quantities/python-quantities.git@master RUN python -c "import quantities as pq" RUN python -c "import sciunit.scores" @@ -102,6 +107,11 @@ RUN python -c "from neuronunit.models.reduced import ReducedModel" RUN python -c "import neuron" RUN python -c "import pyneuroml" RUN nrnivmodl +RUN /opt/conda/bin/pip install graphviz + +RUN git clone https://github.com/soravux/scoop.git +WORKDIR scoop +RUN sudo /opt/conda/bin/python setup.py install RUN python -c "import scoop" RUN python -c "import deap" RUN nrniv @@ -150,5 +160,18 @@ RUN cat $HOME/func2rc.sh >> ~/.bashrc RUN sudo chown -R jovyan /home/jovyan/work ENV QT_QPA_PLATFORM offscreen ENV PYTHONPATH $PYTHONPATH/home/jovyan/neuronunit/neuronunit/optimization -RUN /bin/bash -c "source $HOME/func2rc.sh" + WORKDIR $HOME/neuronunit/neuronunit +RUN conda install dask +WORKDIR $HOME +RUN rm -r $HOME/neuronunit +RUN git clone -b dev https://github.com/russelljjarvis/neuronunit.git +RUN /bin/bash -c "source $HOME/func2rc.sh" +WORKDIR $HOME/neuronunit/neuronunit/optimization +RUN cat nsga_parallel.py +RUN sudo chown -R jovyan $HOME +RUN sudo cp $HOME/func2rc.sh . + +#RUN /bin/bash func2rc.sh +ENV PYTHONPATH "/home/jovyan/neuronunit" +ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 10 ; python stdout_worker.py & ipython -i nsga_parallel.py /bin/bash \ No newline at end of file From ca657dfa1ca749129fc4fa63d37c3bb46b231685 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Tue, 19 Sep 2017 17:20:02 -0700 Subject: [PATCH 65/97] dev changes --- neuronunit-optimization/Dockerfile | 5 +++++ neuronunit-optimization/README.md | 16 ---------------- 2 files changed, 5 insertions(+), 16 deletions(-) delete mode 100644 neuronunit-optimization/README.md diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 5a9b9f9..21ed9af 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -165,13 +165,18 @@ WORKDIR $HOME/neuronunit/neuronunit RUN conda install dask WORKDIR $HOME RUN rm -r $HOME/neuronunit +RUN echo "reclone " RUN git clone -b dev https://github.com/russelljjarvis/neuronunit.git RUN /bin/bash -c "source $HOME/func2rc.sh" +WORKDIR $HOME/neuronunit/neuronunit/optimization/NeuroML2 +RUN nrnivmodl WORKDIR $HOME/neuronunit/neuronunit/optimization + RUN cat nsga_parallel.py RUN sudo chown -R jovyan $HOME RUN sudo cp $HOME/func2rc.sh . #RUN /bin/bash func2rc.sh ENV PYTHONPATH "/home/jovyan/neuronunit" +RUN echo "the subsequent call looks like a hang, but in fact its a deliberate 10 second sleep" ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 10 ; python stdout_worker.py & ipython -i nsga_parallel.py /bin/bash \ No newline at end of file diff --git a/neuronunit-optimization/README.md b/neuronunit-optimization/README.md deleted file mode 100644 index c1d36a2..0000000 --- a/neuronunit-optimization/README.md +++ /dev/null @@ -1,16 +0,0 @@ - -Ipython Parallel seems to benefit from tini - -https://github.com/krallin/tini - -NOTE: If you are using Docker 1.13 or greater, Tini is included in Docker itself. This includes all versions of Docker CE. To enable Tini, just pass the --init flag to docker run. - -Why tini? (init backwards) - -Using Tini has several benefits: - -It protects you from software that accidentally creates zombie processes, which can (over time!) starve your entire system for PIDs (and make it unusable). -It ensures that the default signal handlers work for the software you run in your Docker image. For example, with Tini, SIGTERM properly terminates your process even if you didn't explicitly install a signal handler for it. -It does so completely transparently! Docker images that work without Tini will work with Tini without any changes. -If you'd like more detail on why this is useful, review this issue discussion: What is advantage of Tini?. - From 4667720ce0084ef36855b50c7d67ee45a3e32ce1 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Tue, 19 Sep 2017 21:09:24 -0700 Subject: [PATCH 66/97] instructions that seem to work --- neuronunit-optimization/Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 21ed9af..88ae3f2 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -175,8 +175,13 @@ WORKDIR $HOME/neuronunit/neuronunit/optimization RUN cat nsga_parallel.py RUN sudo chown -R jovyan $HOME RUN sudo cp $HOME/func2rc.sh . +RUN conda install -c anaconda python-graphviz +RUN conda install -c anaconda graphviz #RUN /bin/bash func2rc.sh ENV PYTHONPATH "/home/jovyan/neuronunit" RUN echo "the subsequent call looks like a hang, but in fact its a deliberate 10 second sleep" -ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 10 ; python stdout_worker.py & ipython -i nsga_parallel.py /bin/bash \ No newline at end of file +# The sequence of statement segmentation is very deliberate and particular: +# & for put to background, and start a new process in the foreground ';' for serially wait for end of sleep in this process +# && probably just means the same as ;, finally nsga_parallel should not be put in the background. +ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 10 ; python stdout_worker.py & ipython -i nsga_parallel.py /bin/bash From 37afe86986784aadda38424d58636ad5ab7d8c39 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 25 Sep 2017 18:11:50 -0700 Subject: [PATCH 67/97] dev changes --- neuronunit-optimization/Dockerfile | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 88ae3f2..4c78ac4 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -77,12 +77,13 @@ RUN pip install --process-dependency-links -e . ##### IPython Cluster ##### USER $NB_USER WORKDIR $HOME +RUN echo "do this" RUN ipython profile create default RUN pip install git+https://github.com/roryk/ipython-cluster-helper # Must be done as root to create directories in /usr/local RUN sudo /opt/conda/bin/ipcluster nbextension enable -RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/gprof2dot.git +#RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/gprof2dot.git RUN jupyter nbextension install --sys-prefix --py ipyparallel RUN jupyter nbextension enable --sys-prefix --py ipyparallel @@ -123,7 +124,7 @@ WORKDIR $HOME/neuronunit/neuronunit/tests/ RUN sudo /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz RUN pip install --upgrade neo -RUN /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz +#RUN /opt/conda/bin/pip install https://pypi.python.org/packages/f7/e8/cfad821bc4bc20c2d5ce31dec3378e2791e41ae61a138913ec1462f8d082/neo-0.5.1.tar.gz RUN conda install python-graphviz graphviz WORKDIR /home/git USER root @@ -136,7 +137,8 @@ RUN sudo chown -R jovyan . RUN echo "import os">> run_ipp1.p -RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client; import os; os.system('ipcluster start --profile=chase --debug &')" +RUN echo "do this" +RUN /opt/conda/bin/ipython3 -c "import os; os.system('ipcluster start --profile=chase --debug &'); from ipyparallel import Client" WORKDIR $HOME/mnt RUN sudo chown -R jovyan $HOME @@ -184,4 +186,16 @@ RUN echo "the subsequent call looks like a hang, but in fact its a deliberate 10 # The sequence of statement segmentation is very deliberate and particular: # & for put to background, and start a new process in the foreground ';' for serially wait for end of sleep in this process # && probably just means the same as ;, finally nsga_parallel should not be put in the background. -ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 10 ; python stdout_worker.py & ipython -i nsga_parallel.py /bin/bash +# ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 10 ; python stdout_worker.py & ipython -i nsga_parallel.py /bin/bash + + +FROM scidash/neuronunit-optimization +COPY stdout_worker.py $HOME/stdout_worker.py +COPY func2rc.sh $HOME/func2rc.sh +RUN cat $HOME/func2rc.sh >> ~/.bashrc +RUN sudo chown -R jovyan /home/jovyan/work +ENV QT_QPA_PLATFORM offscreen +ENV PYTHONPATH $PYTHONPATH/home/jovyan/neuronunit/neuronunit/optimization +RUN /bin/bash -c "source $HOME/func2rc.sh" +WORKDIR $HOME/neuronunit/neuronunit +RUN sudo /opt/conda/bin/pip install dask \ No newline at end of file From a1a1b1bd9beefeb6a77e113b60ba0d28157adf87 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 29 Sep 2017 12:13:53 -0700 Subject: [PATCH 68/97] dev changes --- dev/Dockerfile | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 dev/Dockerfile diff --git a/dev/Dockerfile b/dev/Dockerfile new file mode 100644 index 0000000..fa1b40c --- /dev/null +++ b/dev/Dockerfile @@ -0,0 +1,15 @@ +FROM scidash/neuronunit-optimization +COPY stdout_worker.py $HOME/stdout_worker.py +COPY func2rc.sh $HOME/func2rc.sh +RUN cat $HOME/func2rc.sh >> ~/.bashrc +RUN sudo chown -R jovyan /home/jovyan/work +ENV QT_QPA_PLATFORM offscreen +ENV PYTHONPATH $PYTHONPATH/home/jovyan/neuronunit/neuronunit/optimization +RUN /bin/bash -c "source $HOME/func2rc.sh" +WORKDIR $HOME/neuronunit/neuronunit +RUN sudo /opt/conda/bin/pip install dask + + + +RUN sudo rm -r $HOME/work +RUN sudo rm -r /opt/conda/lib/python3.5/site-packages/neuronunit* \ No newline at end of file From f2b0438ac8eb14c916cd927969e1bac40b64a389 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sun, 1 Oct 2017 14:47:17 -0700 Subject: [PATCH 69/97] dev changes --- neuronunit-optimization/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 4c78ac4..692c6bf 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -174,6 +174,8 @@ WORKDIR $HOME/neuronunit/neuronunit/optimization/NeuroML2 RUN nrnivmodl WORKDIR $HOME/neuronunit/neuronunit/optimization + + RUN cat nsga_parallel.py RUN sudo chown -R jovyan $HOME RUN sudo cp $HOME/func2rc.sh . From eb2dd1467042d6a9214c769b2e9115bbcc9ab4ba Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 24 May 2018 15:05:25 -0700 Subject: [PATCH 70/97] dev changes --- neuron-mpi-neuroml/Dockerfile | 16 ++++++------- neuronunit-optimization/Dockerfile | 36 ++---------------------------- 2 files changed, 10 insertions(+), 42 deletions(-) diff --git a/neuron-mpi-neuroml/Dockerfile b/neuron-mpi-neuroml/Dockerfile index 8255c0c..63b4b97 100644 --- a/neuron-mpi-neuroml/Dockerfile +++ b/neuron-mpi-neuroml/Dockerfile @@ -34,11 +34,11 @@ ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH WORKDIR $HOME RUN \ - wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.4/nrn-7.4.tar.gz && \ - tar -xzf nrn-7.4.tar.gz && \ - rm nrn-7.4.tar.gz + wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.5/nrn-7.5.tar.gz && \ + tar -xzf nrn-7.5.tar.gz && \ + rm nrn-7.5.tar.gz -WORKDIR $HOME/nrn-7.4 +WORKDIR $HOME/nrn-7.5 ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH RUN ./configure --prefix=`pwd` --with-paranrn --without-iv --with-nrnpython=/opt/conda/bin/python3 RUN sudo make all && \ @@ -49,15 +49,15 @@ RUN make install WORKDIR src/nrnpython RUN python setup.py install -ENV NEURON_HOME $HOME/nrn-7.4/x86_64 +ENV NEURON_HOME $HOME/nrn-7.5/x86_64 ENV PATH $NEURON_HOME/bin:$PATH # Get JNeuroML #Change to this when PR is accepted -#RUN git clone https://github.com/NeuroML/jNeuroML +RUN git clone https://github.com/NeuroML/jNeuroML WORKDIR $HOME -RUN git clone https://github.com/russelljjarvis/jNeuroML.git +#RUN git clone https://github.com/russelljjarvis/jNeuroML.git WORKDIR jNeuroML RUN python getNeuroML.py -WORKDIR $WORK_HOME \ No newline at end of file +WORKDIR $WORK_HOME diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 1329df9..280403f 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -11,7 +11,6 @@ USER root RUN apt-get update RUN apt-get install -y gvfs-bin libxss1 python3-setuptools RUN apt-get install -y python-tk curl apt-utils -#RUN apt-get install -y povray eog RUN chown -R jovyan $HOME RUN chown -R jovyan /opt/conda/lib/python3.5/site-packages/ @@ -22,35 +21,11 @@ RUN pip install IPython \ jupyterhub \ notebook \ ipykernel \ - ipyparallel \ - enum34 -RUN conda install mpi4py + RUN easy_install gevent RUN easy_install greenlet -##### Scoop ##### -WORKDIR $HOME -RUN git clone https://github.com/soravux/scoop -WORKDIR scoop -RUN python setup.py install - -##### BluePyOpt ###### -WORKDIR $HOME -RUN git clone https://github.com/russelljjarvis/BluePyOpt.git -WORKDIR BluePyOpt -RUN python setup.py install -RUN python -c "import bluepyopt" - -##### IPython Cluster ##### -USER $NB_USER -WORKDIR $HOME -RUN ipython profile create default -RUN pip install git+https://github.com/roryk/ipython-cluster-helper -# Must be done as root to create directories in /usr/local -RUN sudo /opt/conda/bin/ipcluster nbextension enable - ENV PATH $PATH:/opt/conda/bin -ENV PATH $PATH:/opt/conda/bin/ipcluster ENV PATH $PATH:/opt/conda/bin/ipython ENV PATH $PATH:/opt/conda/bin/pip ENV PATH $PATH:/opt/conda/bin/python @@ -65,13 +40,6 @@ RUN python -c "import quantities" RUN python -c "import neuron" RUN python -c "import pyneuroml" RUN nrnivmodl -RUN python -c "import scoop" -RUN python -c "import deap" RUN nrniv -#RUN export PATH=$PATH - -#un comment the following line to test ipcluster during build. -#RUN ipcluster start --profile=chase --debug & -#https://github.com/russelljjarvis/neuronunit.git -WORKDIR $WORK_HOME \ No newline at end of file +WORKDIR $WORK_HOME From 2d81fd49d875e48d0d020684c1285efa5e419ebf Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 24 May 2018 16:02:06 -0700 Subject: [PATCH 71/97] dev changes --- neuronunit-optimization/Dockerfile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index cfad292..6b75279 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -20,9 +20,8 @@ RUN apt-get install -y python-tk curl apt-utils #RUN sudo chown -R jovyan $HOME #RUN sudo chown -R jovyan /opt/conda/lib/python3.5/site-packages/ -USER $NB_USER RUN pip install --upgrade pip -RUN pip install -U matplotlib +RUN pip install matplotlib RUN pip install IPython \ jupyterhub \ notebook \ @@ -31,7 +30,7 @@ RUN pip install IPython \ numba #numba is for optimized code, bqplot is for interactive plotting. -RUN conda install mpi4py +RUN conda install mpi4py dask distributed RUN easy_install gevent @@ -43,11 +42,11 @@ ENV PATH $PATH:/opt/conda/bin/pip ENV PATH $PATH:/opt/conda/bin/python ENV PATH $PATH:/opt/conda/lib/python3.5/site-packages ENV PATH $PATH:$PYTHONPATH - +USER jovyan RUN printenv PATH RUN python -c "import pyneuroml" RUN python -c "import neuronunit" -RUN python -c "from neuronunit.models.reduced import ReducedModel" +# RUN python -c "from neuronunit.models.reduced import ReducedModel" RUN python -c "import quantities" RUN python -c "import neuron" RUN python -c "import pyneuroml" From fc98af20917062123ba031c659ea9757d1297092 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 24 May 2018 16:09:53 -0700 Subject: [PATCH 72/97] merge resolved --- iceweasel/Dockerfile | 43 --------------------------- iceweasel/README.md | 26 ---------------- neuronunit-optimization/run_opt_nb.sh | 1 - 3 files changed, 70 deletions(-) delete mode 100644 iceweasel/Dockerfile delete mode 100644 iceweasel/README.md delete mode 100644 neuronunit-optimization/run_opt_nb.sh diff --git a/iceweasel/Dockerfile b/iceweasel/Dockerfile deleted file mode 100644 index e7dd88f..0000000 --- a/iceweasel/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -#author Russell Jarvis rjjarvis@asu.edu -#author Rick Gerkin rgerkin@asu.edu -FROM scidash/neuronunit -USER root - -RUN apt-get update -RUN apt-get install -y iceweasel gedit meld gvfs-bin - -RUN wget https://atom.io/download/deb -O atom.deb -RUN dpkg -i atom.deb -RUN python -c "import pyneuroml" - - - -ENV WORK_HOME $HOME/work/scidash - -RUN chown -R jovyan $HOME -USER $NB_USER - - - -RUN python -c "import neuronunit" -RUN python -c "from neuronunit.models.reduced import ReducedModel" -RUN python -c "import quantities" -RUN python -c "import neuron" -RUN python -c "import pyneuroml" -RUN nrnivmodl -RUN python -c "import scoop" -RUN python -c "import deap" -RUN nrniv - -#The following are convenience aliases -RUN echo 'alias nb="jupyter-notebook' - - -RUN echo 'alias mnt="cd /home/mnt"' >> ~/.bashrc -RUN echo 'alias erc="emacs ~/.bashrc"' >> ~/.bashrc -RUN echo 'alias src="source ~/.bashrc"' >> ~/.bashrc -RUN echo 'alias egg="cd /opt/conda/lib/python3.5/site-packages/"' >> ~/.bashrc -RUN echo 'alias nu="cd /home/jovyan/work/scidash/neuronunit"' >> ~/.bashrc -RUN echo 'alias model="cd /work/scidash/neuronunit/neuronunit/models"' >> ~/.bashrc -RUN echo 'alias sciunit="cd /work/scidash/sciunit"' >> ~/.bashrc -RUN echo 'alias nu="python -c "from neuronunit.models.reduced import ReducedModel""' diff --git a/iceweasel/README.md b/iceweasel/README.md deleted file mode 100644 index 845111d..0000000 --- a/iceweasel/README.md +++ /dev/null @@ -1,26 +0,0 @@ -## Support for graphical development ipython notebook. - -Docker image internal support for graphical browser (`iceweasel`), graphical git merge (`meld`), and code editor (`atom` and `gedit`). - -## For an Ubuntu host: -This works very easily. -launching: -I have defined the alias in my `~/.bashrc`: -`drh` (Docker Run Here): - -``` -alias drh=' sudo docker run -it -e DISPLAY=$DISPLAY -v `pwd`:/home/mnt \ - -v /tmp/.X11-unix:/tmp/.X11-unix \ - deapscoop1 /bin/bash' -``` -The alias probably should instead be function that is able to accept arguments also. - -## For an Apple/MAC host - -OSX doesn't have a default x11 server so you must install quartz. - -https://fredrikaverpil.github.io/2016/07/31/docker-for-mac-and-gui-applications/ - -This works because you are mounting the volume associated with your hosts.X11 server binary, and passing in your hosts environmental variable. I anticipate a future when the drh command will become very long. - -The next step is to build this outside of and on-top of docker-stacks images using docker-compose, and also getting docker compose to fill out my github credentials. diff --git a/neuronunit-optimization/run_opt_nb.sh b/neuronunit-optimization/run_opt_nb.sh deleted file mode 100644 index 852e2f7..0000000 --- a/neuronunit-optimization/run_opt_nb.sh +++ /dev/null @@ -1 +0,0 @@ -docker run -p 8888:8888 -v `pwd`:/home/jovyan/mnt pnp jupyter notebook --ip=0.0.0.0 --NotebookApp.token=\"\" --NotebookApp.disable_check_xsrf=True From c895f3576270e7942dd9b9bbb4684132003d45bb Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 31 May 2018 15:40:39 -0700 Subject: [PATCH 73/97] Delete Dockerfile --- issue94/Dockerfile | 45 --------------------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 issue94/Dockerfile diff --git a/issue94/Dockerfile b/issue94/Dockerfile deleted file mode 100644 index d1e4fb2..0000000 --- a/issue94/Dockerfile +++ /dev/null @@ -1,45 +0,0 @@ -FROM scidash/neuronunit-optimization - -WORKDIR /home/jovyan/mnt -USER root -RUN sudo chown -R jovyan /opt/conda -USER jovyan -RUN rm -rf /opt/conda/lib/python3.5/site-packages/*allensdk* -RUN pip install --process-dependency-links git+https://github.com/rgerkin/AllenSDK -#RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git - -RUN sudo chown -R jovyan /home/jovyan/mnt -RUN sudo /opt/conda/bin/pip install psutil - -WORKDIR /home/jovyan/work -RUN git clone -b dev https://github.com/rgerkin/informatics_poster.git -RUN cp -r informatics_poster neuronunit -# https://github.com/rgerkin/informatics_poster.git - -#This is informed by Rick's actual code: -COPY stdout_worker.py /home/jovyan/work/neuronunit/neuronunit/optimization - - -#COPY neuronunit /home/jovyan/mnt/neuronunit - -#/home/jovyan/work/neuronunit -WORKDIR /home/jovyan/work/neuronunit/neuronunit/optimization -WORKDIR /home/jovyan/work/neuronunit/neuronunit/optimization/NeuroML2 -#/neuronunit/optimization/NeuroML2 -RUN sudo chown -R jovyan /home/jovyan/mnt - -RUN nrnivmodl -#WORKDIR /home/jovyan/mnt/neuronunit/neuronunit/optimization -WORKDIR $HOME/work/special/stable/neuronunit/optimization -ENV QT_QPA_PLATFORM offscreen - -ENV PYTHONPATH /home/jovyan/mnt/neuronunit/neuronunit/optimization - - - -COPY func2rc.sh $HOME/func2rc.sh -RUN cat $HOME/func2rc.sh >> $HOME/.bashrc - - - - From d36a5997dd3ffd4efd910650bf11d3d4a8185c40 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 31 May 2018 15:40:48 -0700 Subject: [PATCH 74/97] Delete func2rc.sh --- issue94/func2rc.sh | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 issue94/func2rc.sh diff --git a/issue94/func2rc.sh b/issue94/func2rc.sh deleted file mode 100644 index c1a701e..0000000 --- a/issue94/func2rc.sh +++ /dev/null @@ -1,19 +0,0 @@ - - -function sc(){ - echo $1 - echo `pwd` - export IPYTHONDIR=$1 - ipcluster start -n 8 --profile=default --workdir=$1 & - sleep 5 - python stdout_worker.py & - # explanation - # there is some ugly inconsistencies between the - # controller and the engines on ipyparallel - # basically the controllers fixed location of neuronunit is fixed to /home/jovyan/work/neuronunit/neuronunit - # this probably - # because PYTHONPATH was set to this early with ENV - # this is very static and it can't be updated - ln -s "`$1`../../neuronunit /home/jovyan/work/neuronunit/neuronunit" -} - From b56b2a2259d19794c5bc63d0dd66254c677a9776 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 4 Jun 2018 17:29:11 -0700 Subject: [PATCH 75/97] cluster specific docker build changes --- issue94/neuronunit | 1 - neuron-mpi-neuroml-extra/Dockerfile | 60 ------------------- neuron-mpi-neuroml-extra/test_parallel_hoc.py | 11 ---- neuronunit-neuroconstruct/Dockerfile | 33 ---------- neuronunit-optimization/Dockerfile | 13 +++- non_embarrasing_nrn/Dockerfile | 49 --------------- reproduce_error/Dockerfile | 17 ------ 7 files changed, 12 insertions(+), 172 deletions(-) delete mode 160000 issue94/neuronunit delete mode 100644 neuron-mpi-neuroml-extra/Dockerfile delete mode 100644 neuron-mpi-neuroml-extra/test_parallel_hoc.py delete mode 100644 neuronunit-neuroconstruct/Dockerfile delete mode 100644 non_embarrasing_nrn/Dockerfile delete mode 100644 reproduce_error/Dockerfile diff --git a/issue94/neuronunit b/issue94/neuronunit deleted file mode 160000 index b5e1e12..0000000 --- a/issue94/neuronunit +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b5e1e12fb42b84acb8006d7fca40a4fa9a1b9356 diff --git a/neuron-mpi-neuroml-extra/Dockerfile b/neuron-mpi-neuroml-extra/Dockerfile deleted file mode 100644 index 74f3b2a..0000000 --- a/neuron-mpi-neuroml-extra/Dockerfile +++ /dev/null @@ -1,60 +0,0 @@ -FROM scidash/neuron-mpi-neuroml - -#RUN /opt/conda/bin/ipython3 setup.py install -RUN /opt/conda/bin/ipython -c "from neuron import h" -RUN /opt/conda/bin/ipython3 -c "from neuron import h" - -ENV HOME /home/jovyan -ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH -ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH - -RUN sudo chown -R jovyan /home/jovyan -WORKDIR /home/jovyan/nrn-7.4/src/parallel -RUN nrniv test0.hoc -RUN mpiexec -np 4 nrniv -mpi test0.hoc -RUN mpiexec -np 4 nrniv -mpi test1.hoc -RUN mpiexec -np 4 nrniv -mpi test2.hoc -RUN mpiexec -np 4 nrniv -mpi test3.hoc -RUN mpiexec -np 4 nrniv -mpi test4.hoc -RUN mpiexec -np 4 nrniv -mpi test5.hoc -RUN mpiexec -np 4 nrniv -mpi test6.hoc -RUN mpiexec -np 4 nrniv -mpi test7.hoc -ADD ./test_parallel_hoc.py /home/jovyan/nrn-7.4/src/parallel/ - -RUN mpiexec -np 4 nrniv -mpi -python test_fixed.py - -RUN sudo /opt/conda/bin/pip install zmq -RUN sudo /opt/conda/bin/pip install packaging -#RUN sudo /opt/conda/bin/pip install --upgrade pip#notebook -RUN sudo /opt/conda/bin/pip install notebook -RUN sudo /opt/conda/bin/pip install ipyparallel -RUN which /opt/conda/bin/ipcluster -RUN sudo /opt/conda/bin/ipcluster nbextension enable -RUN sudo /opt/conda/bin/ipython profile create chase -ENV PYTHONPATH "/opt/conda/bin/python3.5/dist-packages" -RUN echo $PYTHONPATH -RUN which python -RUN /opt/conda/bin/ipython3 -c "import sys; print(sys.path)" -RUN /opt/conda/bin/ipython3 -c "from ipyparallel import Client" -#RUN /opt/conda/bin/ipython -c "import os;os.system('ipcluster start -n 4 --engines=MPIEngineSetLauncher')" - -#RUN sudo ipcluster start --profile=chase --debug & -#RUN mpiexec -n 4 ipengine --mpi=mpi4py - -COPY ./test_fixed.py /home/jovyan/nrn-7.4/src/parallel -COPY ./test_fixed2.py /home/jovyan/nrn-7.4/src/parallel -RUN ls /home/jovyan/nrn-7.4/src/parallel/*.py -RUN ls *.py -RUN pwd - -RUN ls /home/jovyan/nrn-7.4/src/parallel/test_fixed2.py -RUN echo "import os">> run_ipp1.py -#RUN echo "os.system('ipcluster start --profile=chase --debug &')" >> run_ipp1.py -RUN echo "os.system('ipcluster start -n 4 --engines=MPIEngineSetLauncher --profile=chase --debug &')" >> run_ipp1.py -#RUN conda install mpi4py -#RUN echo "import ipyparallel as ipp ; rc = ipp.Client(profile='chase'); print('hello from before cpu '); print(rc.ids);" >> run_ipp2.py -#RUN ipython run_ipp1.py && sleep 15 && ipython run_ipp2.py -RUN /opt/conda/bin/ipython3 -c "from neuron import h" - -RUN /opt/conda/bin/ipython3 run_ipp1.py && sleep 15 && mpiexec -n 4 nrniv -mpi -python /home/jovyan/nrn-7.4/src/parallel/test_fixed2.py -#RUN /opt/conda/bin/ipython3 run_ipp1.py && sleep 15 && mpiexec -n 4 /opt/conda/bin/ipengine --mpi=mpi4py /home/jovyan/nrn-7.4/src/parallel/test_fixed2.py diff --git a/neuron-mpi-neuroml-extra/test_parallel_hoc.py b/neuron-mpi-neuroml-extra/test_parallel_hoc.py deleted file mode 100644 index 5dd5e90..0000000 --- a/neuron-mpi-neuroml-extra/test_parallel_hoc.py +++ /dev/null @@ -1,11 +0,0 @@ -from neuron import h -pc = h.ParallelContext() - -id = int(pc.id()) -nhost = int(pc.nhost()) - -print('I am %d of %d'%(id, nhost)) - -pc.runworker() -pc.done() -h.quit() diff --git a/neuronunit-neuroconstruct/Dockerfile b/neuronunit-neuroconstruct/Dockerfile deleted file mode 100644 index 8fe1483..0000000 --- a/neuronunit-neuroconstruct/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -# author Russell Jarvis rjjarvis@asu.edu -# author Rick Gerkin rgerkin@asu.edu -# neuronunit-showcase - -FROM scidash/neuronunit - -################# -# Showcase for NeuroConstruct (http://www.neuroconstruct.org/) by Padraig Gleeson, -# a subproject of Neural Ensemble (http://neuralensemble.org/) -################# -USER root -RUN apt-get update -RUN apt-get install -y subversion -USER $NB_USER -RUN pip install execnet -WORKDIR $HOME -RUN git clone https://github.com/NeuralEnsemble/neuroConstruct.git -WORKDIR neuroConstruct -RUN bash updatenC.sh -RUN bash nC.sh -make -RUN ant run -WORKDIR osb -RUN ./checkOsb.sh -USER root -RUN ln -s $NEURON_HOME/bin/nrnivmodl /usr/local/bin/ -USER $NB_USER -WORKDIR $HOME/neuroConstruct -RUN ant test -Dsimulators='NEURON' -ENV NC_HOME $HOME/neuroConstruct -ENV PYTHONPATH $NC_HOME -USER $NB_USER -RUN python -c "import pythonnC" -WORKDIR $WORK_HOME diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index 6b75279..eaae7fb 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -30,7 +30,7 @@ RUN pip install IPython \ numba #numba is for optimized code, bqplot is for interactive plotting. -RUN conda install mpi4py dask distributed +RUN conda install dask distributed RUN easy_install gevent @@ -42,6 +42,14 @@ ENV PATH $PATH:/opt/conda/bin/pip ENV PATH $PATH:/opt/conda/bin/python ENV PATH $PATH:/opt/conda/lib/python3.5/site-packages ENV PATH $PATH:$PYTHONPATH + +RUN pip install dask +RUN pip install tornado zmq +RUN pip install --upgrade zmq tornado pip +RUN conda install -c anaconda pyzmq +RUN conda install -c conda-forge libsodium + + USER jovyan RUN printenv PATH RUN python -c "import pyneuroml" @@ -53,5 +61,8 @@ RUN python -c "import pyneuroml" RUN nrnivmodl RUN nrniv WORKDIR $HOME +RUN sudo chown -R jovyan $HOME ENV PYTHONPATH $HOME/neuronunit:$PYTHONPATH +ENTRYPOINT /bin/bash +# RUN pip uninstall tornado diff --git a/non_embarrasing_nrn/Dockerfile b/non_embarrasing_nrn/Dockerfile deleted file mode 100644 index 797a97a..0000000 --- a/non_embarrasing_nrn/Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ - -#FROM scidash/scipy-notebook-plus -FROM neuralensemble/base -MAINTAINER andrew.davison@unic.cnrs-gif.fr -ENV NEST_VER=2.12.0 NRN_VER=7.4 - -USER root - -WORKDIR $HOME - - -# Get python bindings for open mpi - -RUN apt-get update; apt-get install -y automake libtool build-essential openmpi-bin libopenmpi-dev git vim \ - wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ - python3-pip python3-numpy python3-scipy python3-matplotlib python3-jinja2 python3-mock \ - ipython3 python3-httplib2 python3-docutils python3-yaml \ - python3-venv python3-mpi4py python3-tables cmake - - - -# Install NEURON-7.4 with python, with MPI -# An infamous build process,and much of the motivation for this container -RUN wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.4/nrn-7.4.tar.gz -RUN tar -xzf nrn-7.4.tar.gz && rm nrn-7.4.tar.gz -WORKDIR $HOME/nrn-7.4 -RUN ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python --with-paranrn -RUN make all -#RUN conda install 2to3 -RUN make install - -# Create python bindings for NEURON -WORKDIR src/nrnpython -RUN python setup.py install -ENV NEURON_HOME $HOME/nrn-7.4/x86_64 -ENV PATH $NEURON_HOME/bin:$PATH -WORKDIR $HOME - - -#RUN /usr/bin/mpiexec -np 4 nrniv -mpi $HOME/neuron/nrn-7.4/src/parallel/test0.hoc -#RUN /usr/bin/mpiexec -np 4 nrniv -mpi=/usr/bin/mpiexec $HOME/neuron/nrn-7.4/src/parallel/test0.hoc - -# Get JNeuroML -#Change to this when PR is accepted -RUN git clone https://github.com/NeuroML/jNeuroML -RUN git clone https://github.com/russelljjarvis/jNeuroML.git -WORKDIR jNeuroML -RUN python getNeuroML.py - diff --git a/reproduce_error/Dockerfile b/reproduce_error/Dockerfile deleted file mode 100644 index 1fccfe5..0000000 --- a/reproduce_error/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM scidash/neuronunit-optimization - -WORKDIR /home/jovyan/mnt -USER root -RUN sudo chown -R jovyan /opt/conda -USER jovyan -RUN rm -rf /opt/conda/lib/python3.5/site-packages/*allensdk* -RUN pip install --process-dependency-links git+https://github.com/rgerkin/AllenSDK -#RUN git clone -b dev https://github.com/russelljjarvis/informatics_poster.git -COPY /informatics_poster /home/jovyan/mnt/informatics_poster -RUN sudo chown -R jovyan /home/jovyan/mnt/informatics_poster -WORKDIR /home/jovyan/mnt/informatics_poster/neuronunit/optimization -RUN nrnivmodl NeuroML2 -ENV QT_QPA_PLATFORM offscreen -ENV PYTHONPATH $PYTHONPATH:/home/jovyan/mnt/informatics_poster/neuronunit/optimization -ENTRYPOINT ipcluster start -n 8 --profile=default & sleep 5 && ipython -i nsga_parallel_no_vm.py - From 8697b370d214a33aa5c4b421396a35fefa840e46 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 14 Jun 2018 00:39:58 -0400 Subject: [PATCH 76/97] changes to Dockerstacks --- build | 0 neuron-mpi-neuroml/Dockerfile | 1 + neuronunit-optimization/Dockerfile | 17 ++++++++++------- neuronunit/Dockerfile | 2 +- scipy-notebook-plus/Dockerfile | 4 +++- test-all | 0 6 files changed, 15 insertions(+), 9 deletions(-) mode change 100755 => 100644 build mode change 100755 => 100644 test-all diff --git a/build b/build old mode 100755 new mode 100644 diff --git a/neuron-mpi-neuroml/Dockerfile b/neuron-mpi-neuroml/Dockerfile index 63b4b97..2391063 100644 --- a/neuron-mpi-neuroml/Dockerfile +++ b/neuron-mpi-neuroml/Dockerfile @@ -59,5 +59,6 @@ RUN git clone https://github.com/NeuroML/jNeuroML WORKDIR $HOME #RUN git clone https://github.com/russelljjarvis/jNeuroML.git WORKDIR jNeuroML +RUN ls -ltr *.py RUN python getNeuroML.py WORKDIR $WORK_HOME diff --git a/neuronunit-optimization/Dockerfile b/neuronunit-optimization/Dockerfile index eaae7fb..baa942c 100644 --- a/neuronunit-optimization/Dockerfile +++ b/neuronunit-optimization/Dockerfile @@ -28,9 +28,14 @@ RUN pip install IPython \ ipykernel \ enum34 \ numba +RUN /opt/conda/bin/conda info --envs +RUN /opt/conda/bin/conda update -n base conda +# RUN conda update -n base conda #numba is for optimized code, bqplot is for interactive plotting. -RUN conda install dask distributed +RUN conda install -c dask distributed +RUN conda install -c anaconda pyzmq +RUN conda install -c conda-forge libsodium RUN easy_install gevent @@ -46,11 +51,8 @@ ENV PATH $PATH:$PYTHONPATH RUN pip install dask RUN pip install tornado zmq RUN pip install --upgrade zmq tornado pip -RUN conda install -c anaconda pyzmq -RUN conda install -c conda-forge libsodium - +USER $NB_USER -USER jovyan RUN printenv PATH RUN python -c "import pyneuroml" RUN python -c "import neuronunit" @@ -61,8 +63,9 @@ RUN python -c "import pyneuroml" RUN nrnivmodl RUN nrniv WORKDIR $HOME -RUN sudo chown -R jovyan $HOME +RUN sudo chown -R $NB_USER $HOME ENV PYTHONPATH $HOME/neuronunit:$PYTHONPATH -ENTRYPOINT /bin/bash +RUN pip install -U jupyter +# ENTRYPOINT /bin/bash # RUN pip uninstall tornado diff --git a/neuronunit/Dockerfile b/neuronunit/Dockerfile index 22cf4db..f18dc88 100644 --- a/neuronunit/Dockerfile +++ b/neuronunit/Dockerfile @@ -12,7 +12,7 @@ RUN git clone -b dev https://github.com/scidash/neuronunit.git WORKDIR neuronunit RUN pip install --process-dependency-links -e . #RUN sudo /opt/conda/bin/python setup.py install -WORKDIR $WORK_DIR +WORKDIR $HOME # Put the optional local working copy (not the one we just cloned) # on the working path. ENV PYTHONPATH $WORK_HOME/sciunit:$PYTHONPATH diff --git a/scipy-notebook-plus/Dockerfile b/scipy-notebook-plus/Dockerfile index d9a9b76..4b2bc32 100644 --- a/scipy-notebook-plus/Dockerfile +++ b/scipy-notebook-plus/Dockerfile @@ -26,7 +26,9 @@ RUN pip install --upgrade pip # Upgrade to version 2.0 RUN conda install -y matplotlib - +RUN conda update -n base conda +# RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh +# RUN bash Miniconda3-latest-Linux-x86_64.sh # Make sure every Python file belongs to jovyan RUN find /opt/conda ! -user $NB_USER -print0 | xargs -0 -I {} chown -h $NB_USER {} # Remove dangling symlinks diff --git a/test-all b/test-all old mode 100755 new mode 100644 From ab2491d530842967d399c1b70010beaa877ec658 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 15 Mar 2019 15:16:26 -0700 Subject: [PATCH 77/97] network dockerlayer --- network/Dockerfile | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 network/Dockerfile diff --git a/network/Dockerfile b/network/Dockerfile new file mode 100644 index 0000000..fd332ec --- /dev/null +++ b/network/Dockerfile @@ -0,0 +1,12 @@ + + # move to a docker install script. + +RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade +RUN sudo /opt/conda/bin/conda install -y cython +RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git + # faster glif +RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/AllenSDK.git +RUN sudo /opt/conda/bin/conda install -y numpy deap dask numba +RUN sudo /opt/conda/bin/pip install allensdk --upgrade +RUN sudo /opt/conda/bin/pip install neurodynex +RUN sudo /opt/conda/bin/pip install coverage lazyarray lmfit From 3cecffe7516e498cd38453bcad5a12a0d47be8ed Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 15 Mar 2019 15:16:55 -0700 Subject: [PATCH 78/97] network dockerlayer --- network/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/network/Dockerfile b/network/Dockerfile index fd332ec..4c03508 100644 --- a/network/Dockerfile +++ b/network/Dockerfile @@ -3,6 +3,8 @@ RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade RUN sudo /opt/conda/bin/conda install -y cython +RUN sudo /opt/conda/bin/pip install pynn lazyarray + RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git # faster glif RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/AllenSDK.git From 360bf8d1b5229a33cca1209e0d0a3bf179a64db1 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 30 Mar 2019 17:59:28 -0700 Subject: [PATCH 79/97] layer for PyNN --- network/Dockerfile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/network/Dockerfile b/network/Dockerfile index 4c03508..cfc46cf 100644 --- a/network/Dockerfile +++ b/network/Dockerfile @@ -1,4 +1,4 @@ - +FROM scidash/neuronunit-optimization # move to a docker install script. RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade @@ -7,8 +7,11 @@ RUN sudo /opt/conda/bin/pip install pynn lazyarray RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git # faster glif -RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/AllenSDK.git +#RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/AllenSDK.git RUN sudo /opt/conda/bin/conda install -y numpy deap dask numba -RUN sudo /opt/conda/bin/pip install allensdk --upgrade RUN sudo /opt/conda/bin/pip install neurodynex -RUN sudo /opt/conda/bin/pip install coverage lazyarray lmfit + +RUN sudo /opt/conda/bin/pip install coverage lmfit +RUN sudo /opt/conda/bin/pip install allensdk #--upgrade +RUN sudo /opt/conda/bin/conda install pandas +RUN sudo /opt/conda/bin/pip install toolz cloudpickle From 701c92fbd77f894208dce6ae05950c031e82db87 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 5 Apr 2019 16:14:54 -0700 Subject: [PATCH 80/97] dev changes --- neuron-serial/Dockerfile | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 neuron-serial/Dockerfile diff --git a/neuron-serial/Dockerfile b/neuron-serial/Dockerfile new file mode 100644 index 0000000..bd2567e --- /dev/null +++ b/neuron-serial/Dockerfile @@ -0,0 +1,72 @@ +#author russell jarvis rjjarvis@asu.edu +#NEURON Dockerfile +#Set the base image to Ubuntu +FROM scidash/scipy-notebook-plus + +#Get a whole lot of GNU core development tools +#version control java development, maven +#Libraries required for building MPI from source +#Libraries required for building NEURON from source +#Also DO this part as root. +USER root + +RUN apt-get update && apt-get install -y wget bzip2 ca-certificates default-jre default-jdk maven automake libtool \ + wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ + python3-pip python3-numpy python3-scipy python3-matplotlib python3-mock \ + ipython3 python3-docutils \ + python3-mpi4py cmake ssh + + +#Do the rest of the build as user: +#This will create a more familiar environment to continue developing in. +#with less of a need to chown and chmod everything done as root at dockerbuild completion + +RUN git clone https://github.com/neuronsimulator/nrn +WORKDIR nrn +RUN wget https://neuron.yale.edu/ftp/neuron/versions/v7.6/nrn-7.6.x86_64-linux.deb +RUN dpkg -i nrn-7.6.x86_64-linux.deb + +ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH + +# RUN ./build.sh + +# RUN ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python3 +# RUN make # all +# RUN make install + + +USER jovyan +ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH + +# Use numpy 1.12.1 until quantities is compatible with 1.13. +RUN conda install -y scipy numpy==1.12.1 matplotlib +RUN sudo chown -R jovyan /home/jovyan +ENV HOME /home/jovyan +ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH + +RUN wget https://neuron.yale.edu/ftp/neuron/versions/v7.6/nrn-7.6.x86_64-linux.deb +RUN sudo dpkg -i nrn-7.6.x86_64-linux.deb + + +WORKDIR nrn/src/nrnpython +RUN sudo ./build.sh + +RUN sudo ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python3 +RUN sudo make # all +RUN sudo make install + + +RUN python setup.py install +ENV NEURON_HOME $HOME/nrn-7.5/x86_64 +ENV PATH $NEURON_HOME/bin:$PATH + + +# Get JNeuroML +# Change to this when PR is accepted +# RUN git clone https://github.com/NeuroML/jNeuroML +# WORKDIR $HOME +# RUN git clone https://github.com/russelljjarvis/jNeuroML.git +# WORKDIR jNeuroML +# RUN ls -ltr *.py +# RUN python getNeuroML.py +# WORKDIR $WORK_HOME From 5a5bbbc6eea00756b4d7c07c44a5a406430d12b4 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 5 Apr 2019 16:16:51 -0700 Subject: [PATCH 81/97] network unit testing --- network/#Dockerfile# | 23 +++++++ network/Dockerfile | 19 ++++++ ...le (rjjarvis's conflicted copy 2019-04-02) | 23 +++++++ neuron-serial/Dockerfile~ | 68 +++++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 network/#Dockerfile# create mode 100644 network/Dockerfile (rjjarvis's conflicted copy 2019-04-02) create mode 100644 neuron-serial/Dockerfile~ diff --git a/network/#Dockerfile# b/network/#Dockerfile# new file mode 100644 index 0000000..bd43f56 --- /dev/null +++ b/network/#Dockerfile# @@ -0,0 +1,23 @@ +FROM scidash/neuronunit-optimization + # move to a docker install script. + +RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade +RUN sudo /opt/conda/bin/conda install -y cython +RUN sudo /opt/conda/bin/pip install pynn lazyarray + +RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git + # faster glif +#RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/AllenSDK.git +RUN sudo /opt/conda/bin/conda install -y numpy deap dask numba +RUN sudo /opt/conda/bin/pip install neurodynex + +RUN sudo /opt/conda/bin/pip install coverage lmfit +RUN sudo /opt/conda/bin/pip install allensdk #--upgrade +RUN sudo /opt/conda/bin/conda install pandas +RUN sudo /opt/conda/bin/pip install toolz cloudpickle +RUN sudo /opt/conda/bin/pip install pyscaffold + +RUN git clone https://github.com/SALib/SALib.git +WORKDIR SALib +RUN python setup.py develop +RUN sudo /opt/conda/bin/pip install SALib \ No newline at end of file diff --git a/network/Dockerfile b/network/Dockerfile index cfc46cf..e78d382 100644 --- a/network/Dockerfile +++ b/network/Dockerfile @@ -15,3 +15,22 @@ RUN sudo /opt/conda/bin/pip install coverage lmfit RUN sudo /opt/conda/bin/pip install allensdk #--upgrade RUN sudo /opt/conda/bin/conda install pandas RUN sudo /opt/conda/bin/pip install toolz cloudpickle +RUN sudo /opt/conda/bin/pip install setuptools +RUN sudo /opt/conda/bin/conda install -c conda-forge pyscaffold +RUN sudo /opt/conda/bin/pip install --upgrade pip +RUN sudo /opt/conda/bin/conda install python=3.5.0 +# RUN sudo /opt/conda/bin/pip install pyscaffold +# RUN sudo /opt/conda/bin/pip install SALib + +# RUN git clone https://github.com/SALib/SALib.git +# WORKDIR SALib +# RUN python3 setup.py develop + +# uncomment to give PyNN mpi. +# note this is a bad idea. For this project. +# MPI is used for non-embarrasingly parallel computations, +# we use dask here, for embarrassingly parallel. +# RUN sudo apt-get update -y +# RUN sudo apt-get install -y mpich +# RUN pip install mpi4py +RUN pip install git+https://github.com/russelljjarvis/modality \ No newline at end of file diff --git a/network/Dockerfile (rjjarvis's conflicted copy 2019-04-02) b/network/Dockerfile (rjjarvis's conflicted copy 2019-04-02) new file mode 100644 index 0000000..dea3caf --- /dev/null +++ b/network/Dockerfile (rjjarvis's conflicted copy 2019-04-02) @@ -0,0 +1,23 @@ +FROM scidash/neuronunit-optimization + # move to a docker install script. + +RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade +RUN sudo /opt/conda/bin/conda install -y cython +RUN sudo /opt/conda/bin/pip install pynn lazyarray + +RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git + # faster glif +#RUN sudo /opt/conda/bin/pip install git+https://github.com/russelljjarvis/AllenSDK.git +RUN sudo /opt/conda/bin/conda install -y numpy deap dask numba +RUN sudo /opt/conda/bin/pip install neurodynex + +RUN sudo /opt/conda/bin/pip install coverage lmfit +RUN sudo /opt/conda/bin/pip install allensdk #--upgrade +RUN sudo /opt/conda/bin/conda install pandas +RUN sudo /opt/conda/bin/pip install toolz cloudpickle +RUN sudo /opt/conda/bin/pip install pyscaffold + +# RUN git clone https://github.com/SALib/SALib.git +# WORKDIR SALib +# RUN python setup.py develop +RUN sudo /opt/conda/bin/pip install SALib \ No newline at end of file diff --git a/neuron-serial/Dockerfile~ b/neuron-serial/Dockerfile~ new file mode 100644 index 0000000..7b91dac --- /dev/null +++ b/neuron-serial/Dockerfile~ @@ -0,0 +1,68 @@ +#author russell jarvis rjjarvis@asu.edu +#NEURON Dockerfile +#Set the base image to Ubuntu +FROM scidash/scipy-notebook-plus + +#Get a whole lot of GNU core development tools +#version control java development, maven +#Libraries required for building MPI from source +#Libraries required for building NEURON from source +#Also DO this part as root. +USER root + +RUN apt-get update && apt-get install -y wget bzip2 ca-certificates default-jre default-jdk maven automake libtool \ + wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ + python3-pip python3-numpy python3-scipy python3-matplotlib python3-mock \ + ipython3 python3-docutils \ + python3-mpi4py cmake ssh + + +#Do the rest of the build as user: +#This will create a more familiar environment to continue developing in. +#with less of a need to chown and chmod everything done as root at dockerbuild completion + +RUN git clone https://github.com/neuronsimulator/nrn +WORKDIR nrn +RUN wget https://neuron.yale.edu/ftp/neuron/versions/v7.6/nrn-7.6.x86_64-linux.deb +ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH + +# RUN ./build.sh + +# RUN ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python3 +# RUN make # all +# RUN make install + + +USER jovyan +ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH + +# Use numpy 1.12.1 until quantities is compatible with 1.13. +RUN conda install -y scipy numpy==1.12.1 matplotlib +RUN sudo chown -R jovyan /home/jovyan +ENV HOME /home/jovyan +ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH + + + +WORKDIR nrn/src/nrnpython +RUN sudo ./build.sh + +RUN sudo ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python3 +RUN sudo make # all +RUN sudo make install + + +RUN python setup.py install +ENV NEURON_HOME $HOME/nrn-7.5/x86_64 +ENV PATH $NEURON_HOME/bin:$PATH + + +# Get JNeuroML +# Change to this when PR is accepted +# RUN git clone https://github.com/NeuroML/jNeuroML +# WORKDIR $HOME +# RUN git clone https://github.com/russelljjarvis/jNeuroML.git +# WORKDIR jNeuroML +# RUN ls -ltr *.py +# RUN python getNeuroML.py +# WORKDIR $WORK_HOME From 4c5bb7869b59033719714da8d397e00350ff76da Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 5 Apr 2019 21:39:39 -0700 Subject: [PATCH 82/97] network unit testing --- neuron-serial/Dockerfile | 41 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/neuron-serial/Dockerfile b/neuron-serial/Dockerfile index bd2567e..52ce66b 100644 --- a/neuron-serial/Dockerfile +++ b/neuron-serial/Dockerfile @@ -9,7 +9,8 @@ FROM scidash/scipy-notebook-plus #Libraries required for building NEURON from source #Also DO this part as root. USER root - +RUN /opt/conda/bin/conda update conda +RUN apt-get update -y && apt-get upgrade -y RUN apt-get update && apt-get install -y wget bzip2 ca-certificates default-jre default-jdk maven automake libtool \ wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ python3-pip python3-numpy python3-scipy python3-matplotlib python3-mock \ @@ -21,25 +22,16 @@ RUN apt-get update && apt-get install -y wget bzip2 ca-certificates default-jre #This will create a more familiar environment to continue developing in. #with less of a need to chown and chmod everything done as root at dockerbuild completion -RUN git clone https://github.com/neuronsimulator/nrn -WORKDIR nrn RUN wget https://neuron.yale.edu/ftp/neuron/versions/v7.6/nrn-7.6.x86_64-linux.deb RUN dpkg -i nrn-7.6.x86_64-linux.deb -ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH - -# RUN ./build.sh - -# RUN ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python3 -# RUN make # all -# RUN make install - +ENV PATH /usr/bin/python/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH USER jovyan -ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH +ENV PATH /usr/bin/python/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH # Use numpy 1.12.1 until quantities is compatible with 1.13. -RUN conda install -y scipy numpy==1.12.1 matplotlib +RUN sudo /opt/conda/bin/conda install -y scipy numpy==1.12.1 matplotlib RUN sudo chown -R jovyan /home/jovyan ENV HOME /home/jovyan ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH @@ -47,21 +39,30 @@ ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH RUN wget https://neuron.yale.edu/ftp/neuron/versions/v7.6/nrn-7.6.x86_64-linux.deb RUN sudo dpkg -i nrn-7.6.x86_64-linux.deb +RUN sudo git clone https://github.com/neuronsimulator/nrn +WORKDIR nrn +RUN sudo apt-get install flex -y -WORKDIR nrn/src/nrnpython RUN sudo ./build.sh -RUN sudo ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python3 -RUN sudo make # all +RUN sudo ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python +# +RUN sudo apt-get install bison -y +RUN sudo apt-get install byacc -y +RUN cat ./build.sh +# RUN sudo make RUN sudo make install - -RUN python setup.py install -ENV NEURON_HOME $HOME/nrn-7.5/x86_64 +ENV NEURON_HOME $HOME/nrn-7.6/x86_64 ENV PATH $NEURON_HOME/bin:$PATH +# WORKDIR nrn/src/nrnpython +# RUN python setup.py install + + + -# Get JNeuroML +# Don't Get JNeuroML it's slow. # Change to this when PR is accepted # RUN git clone https://github.com/NeuroML/jNeuroML # WORKDIR $HOME From 99fa35fb4f6643c6ecf618c957b4a753070d9041 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 5 Apr 2019 21:41:22 -0700 Subject: [PATCH 83/97] network unit testing --- neuron-serial/Dockerfile | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/neuron-serial/Dockerfile b/neuron-serial/Dockerfile index 52ce66b..0968bf4 100644 --- a/neuron-serial/Dockerfile +++ b/neuron-serial/Dockerfile @@ -24,12 +24,10 @@ RUN apt-get update && apt-get install -y wget bzip2 ca-certificates default-jre RUN wget https://neuron.yale.edu/ftp/neuron/versions/v7.6/nrn-7.6.x86_64-linux.deb RUN dpkg -i nrn-7.6.x86_64-linux.deb - ENV PATH /usr/bin/python/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH USER jovyan ENV PATH /usr/bin/python/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH - # Use numpy 1.12.1 until quantities is compatible with 1.13. RUN sudo /opt/conda/bin/conda install -y scipy numpy==1.12.1 matplotlib RUN sudo chown -R jovyan /home/jovyan @@ -38,36 +36,21 @@ ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH RUN wget https://neuron.yale.edu/ftp/neuron/versions/v7.6/nrn-7.6.x86_64-linux.deb RUN sudo dpkg -i nrn-7.6.x86_64-linux.deb - RUN sudo git clone https://github.com/neuronsimulator/nrn WORKDIR nrn RUN sudo apt-get install flex -y - RUN sudo ./build.sh - RUN sudo ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python -# -RUN sudo apt-get install bison -y +#RUN sudo apt-get install bison -y RUN sudo apt-get install byacc -y RUN cat ./build.sh -# RUN sudo make +RUN sudo make RUN sudo make install +WORKDIR nrn/src/nrnpython +RUN python setup.py install ENV NEURON_HOME $HOME/nrn-7.6/x86_64 ENV PATH $NEURON_HOME/bin:$PATH -# WORKDIR nrn/src/nrnpython -# RUN python setup.py install - - -# Don't Get JNeuroML it's slow. -# Change to this when PR is accepted -# RUN git clone https://github.com/NeuroML/jNeuroML -# WORKDIR $HOME -# RUN git clone https://github.com/russelljjarvis/jNeuroML.git -# WORKDIR jNeuroML -# RUN ls -ltr *.py -# RUN python getNeuroML.py -# WORKDIR $WORK_HOME From 9cee511d4f815e222612f0f3914a24d603ad8caf Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Wed, 10 Apr 2019 17:14:34 -0700 Subject: [PATCH 84/97] with R and Julia support --- julia_nb/Dockerfile | 41 ++++++++++++++++++++++++++++++ julia_nb/stochastic_gd.jl | 53 +++++++++++++++++++++++++++++++++++++++ with-r/Dockerfile | 2 ++ 3 files changed, 96 insertions(+) create mode 100644 julia_nb/Dockerfile create mode 100644 julia_nb/stochastic_gd.jl create mode 100644 with-r/Dockerfile diff --git a/julia_nb/Dockerfile b/julia_nb/Dockerfile new file mode 100644 index 0000000..445d27b --- /dev/null +++ b/julia_nb/Dockerfile @@ -0,0 +1,41 @@ +FROM with_r +USER root +#RUN apt-get install -y julia +# install Julia packages in /opt/julia instead of $HOME +ENV JULIA_DEPOT_PATH=/opt/julia +ENV JULIA_PKGDIR=/opt/julia +ENV JULIA_VERSION=1.0.0 + +RUN mkdir /opt/julia-${JULIA_VERSION} && \ + cd /tmp && \ + wget -q https://julialang-s3.julialang.org/bin/linux/x64/`echo ${JULIA_VERSION} | cut -d. -f 1,2`/julia-${JULIA_VERSION}-linux-x86_64.tar.gz && \ + echo "bea4570d7358016d8ed29d2c15787dbefaea3e746c570763e7ad6040f17831f3 *julia-${JULIA_VERSION}-linux-x86_64.tar.gz" | sha256sum -c - && \ + tar xzf julia-${JULIA_VERSION}-linux-x86_64.tar.gz -C /opt/julia-${JULIA_VERSION} --strip-components=1 && \ + rm /tmp/julia-${JULIA_VERSION}-linux-x86_64.tar.gz +RUN ln -fs /opt/julia-*/bin/julia /usr/local/bin/julia + +# Show Julia where conda libraries are \ +RUN mkdir /etc/julia && \ + echo "push!(Libdl.DL_LOAD_PATH, \"$CONDA_DIR/lib\")" >> /etc/julia/juliarc.jl && \ + # Create JULIA_PKGDIR \ + mkdir $JULIA_PKGDIR && \ + chown $NB_USER $JULIA_PKGDIR + +RUN julia -e 'import Pkg; Pkg.update()' && \ + (test $TEST_ONLY_BUILD || julia -e 'import Pkg; Pkg.add("HDF5")') && \ + julia -e 'import Pkg; Pkg.add("Gadfly")' && \ + julia -e 'import Pkg; Pkg.add("RDatasets")' && \ + julia -e 'import Pkg; Pkg.add("IJulia"); Pkg.add("StatsPlots");Pkg.add("Plots"); Pkg.add("StatsPlots");Pkg.add("DataFrames")' + +RUN julia -e 'import Pkg; Pkg.add("Seaborn"); Pkg.add("PyPlot")' +RUN julia -e 'import Pkg;Pkg.clone("https://github.com/gsoleilhac/NSGAII.jl")' +USER jovyan +# Precompile Julia packages \ +RUN sudo julia -e 'using Pkg; Pkg.add("IJulia"); using IJulia' +ADD stochastic_gd.jl . +RUN sudo julia stochastic_gd.jl + +# move kernelspec out of home \ +# mv $HOME/.local/share/jupyter/kernels/julia* $CONDA_DIR/share/jupyter/kernels/ && \ +# chmod -R go+rx $CONDA_DIR/share/jupyter && \ +# rm -rf $HOME/.local && $JULIA_PKGDIR $CONDA_DIR/share/jupyter diff --git a/julia_nb/stochastic_gd.jl b/julia_nb/stochastic_gd.jl new file mode 100644 index 0000000..d40b79f --- /dev/null +++ b/julia_nb/stochastic_gd.jl @@ -0,0 +1,53 @@ +println("reminder to Russell") +println("to install packages use") +println("launch julia using sudo") +println("try to import module first using, 'using'") +println("include('ml.jl')") +#println("Pkg.add('PyCall')") +println("\n\n\n\n\n\n") +using Pkg + +function trypy() + try + ENV["PYTHON"] = "/opt/conda/bin/python" + Pkg.rm("PyCall") + Pkg.build("PyCall") + Pkg.test("PyCall") + plt = pyimport("matplotlib.pyplot") + x = range(0;stop=2*pi,length=1000); y = sin.(3*x + 4*cos.(2*x)); + plt.plot(x, y, color="red", linewidth=2.0, linestyle="--") + #plt.show() + + #return unreliable_connect() + catch ex + ENV["PYTHON"] = "/anaconda3/bin/python" + Pkg.rm("PyCall") + Pkg.build("PyCall") + Pkg.test("PyCall") + + math = pyimport("math") + Pkg.test("PyCall") + plt = pyimport("matplotlib.pyplot") + x = range(0;stop=2*pi,length=1000); y = sin.(3*x + 4*cos.(2*x)); + plt.plot(x, y, color="red", linewidth=2.0, linestyle="--") + + math.sin(math.pi / 4) # returns ≈ 1/√2 = 0.70710678... + end +end +Pkg.add("StatsPlots") +Pkg.add("PyCall") +Pkg.add("GR") +Pkg.add("IJulia"); +Pkg.add("Plots"); +Pkg.add("StatsPlots"); #to install the StatPlots package. +Pkg.add("DataFrames"); +Pkg.add("Seaborn") +Pkg.add("PyPlot") +Pkg.add("Knet") +using DataFrames +# using IJulia +using Knet +using Plots; +using StatsPlots; +using PyCall; +println("done") diff --git a/with-r/Dockerfile b/with-r/Dockerfile new file mode 100644 index 0000000..24e44f5 --- /dev/null +++ b/with-r/Dockerfile @@ -0,0 +1,2 @@ +FROM network +RUN sudo apt-get install r-base From 9068f298063f6bc27ae98362f5dac1f0f6d1791b Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 19 Apr 2019 17:02:32 -0700 Subject: [PATCH 85/97] change to julia dockerfile --- with_julia/Dockerfile | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 with_julia/Dockerfile diff --git a/with_julia/Dockerfile b/with_julia/Dockerfile new file mode 100644 index 0000000..4671fa8 --- /dev/null +++ b/with_julia/Dockerfile @@ -0,0 +1,40 @@ +FROM with_r +USER root +#RUN apt-get install -y julia +# install Julia packages in /opt/julia instead of $HOME +ENV JULIA_DEPOT_PATH=/opt/julia +ENV JULIA_PKGDIR=/opt/julia +ENV JULIA_VERSION=1.0.0 + +RUN mkdir /opt/julia-${JULIA_VERSION} && \ + cd /tmp && \ + wget -q https://julialang-s3.julialang.org/bin/linux/x64/`echo ${JULIA_VERSION} | cut -d. -f 1,2`/julia-${JULIA_VERSION}-linux-x86_64.tar.gz && \ + echo "bea4570d7358016d8ed29d2c15787dbefaea3e746c570763e7ad6040f17831f3 *julia-${JULIA_VERSION}-linux-x86_64.tar.gz" | sha256sum -c - && \ + tar xzf julia-${JULIA_VERSION}-linux-x86_64.tar.gz -C /opt/julia-${JULIA_VERSION} --strip-components=1 && \ + rm /tmp/julia-${JULIA_VERSION}-linux-x86_64.tar.gz +RUN ln -fs /opt/julia-*/bin/julia /usr/local/bin/julia + +# Show Julia where conda libraries are \ +RUN mkdir /etc/julia && \ + echo "push!(Libdl.DL_LOAD_PATH, \"$CONDA_DIR/lib\")" >> /etc/julia/juliarc.jl && \ + # Create JULIA_PKGDIR \ + mkdir $JULIA_PKGDIR + +RUN julia -e 'import Pkg; Pkg.update()' && \ + (test $TEST_ONLY_BUILD || julia -e 'import Pkg; Pkg.add("HDF5")') && \ + julia -e 'import Pkg; Pkg.add("Gadfly")' && \ + julia -e 'import Pkg; Pkg.add("RDatasets")' && \ + julia -e 'import Pkg; Pkg.add("IJulia")' && \ + julia -e 'import Pkg; Pkg.add("StatsPlots");Pkg.add("Plots");' + +RUN julia -e 'import Pkg; Pkg.add("DataFrames")' + +RUN julia -e 'import Pkg; Pkg.add("Seaborn"); Pkg.add("PyPlot")' +RUN julia -e 'import Pkg;Pkg.clone("https://github.com/gsoleilhac/NSGAII.jl")' +USER jovyan +# Precompile Julia packages \ +RUN sudo julia -e 'using Pkg; Pkg.add("IJulia"); using IJulia' +ADD packages.jl . +RUN sudo chown -R jovyan $HOME +RUN sudo chown -R jovyan $JULIA_PKGDIR +RUN julia packages.jl From 71e00e19b1bbbf6ad69ca746930536968a340de5 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 3 Jun 2019 15:29:14 +1000 Subject: [PATCH 86/97] dev changes --- with_julia/Dockerfile | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/with_julia/Dockerfile b/with_julia/Dockerfile index 4671fa8..2b09486 100644 --- a/with_julia/Dockerfile +++ b/with_julia/Dockerfile @@ -18,16 +18,16 @@ RUN ln -fs /opt/julia-*/bin/julia /usr/local/bin/julia RUN mkdir /etc/julia && \ echo "push!(Libdl.DL_LOAD_PATH, \"$CONDA_DIR/lib\")" >> /etc/julia/juliarc.jl && \ # Create JULIA_PKGDIR \ - mkdir $JULIA_PKGDIR + mkdir $JULIA_PKGDIR RUN julia -e 'import Pkg; Pkg.update()' && \ (test $TEST_ONLY_BUILD || julia -e 'import Pkg; Pkg.add("HDF5")') && \ julia -e 'import Pkg; Pkg.add("Gadfly")' && \ julia -e 'import Pkg; Pkg.add("RDatasets")' && \ - julia -e 'import Pkg; Pkg.add("IJulia")' && \ - julia -e 'import Pkg; Pkg.add("StatsPlots");Pkg.add("Plots");' + julia -e 'import Pkg; Pkg.add("IJulia")' && \ + julia -e 'import Pkg; Pkg.add("StatsPlots");Pkg.add("Plots");' -RUN julia -e 'import Pkg; Pkg.add("DataFrames")' +RUN julia -e 'import Pkg; Pkg.add("DataFrames")' RUN julia -e 'import Pkg; Pkg.add("Seaborn"); Pkg.add("PyPlot")' RUN julia -e 'import Pkg;Pkg.clone("https://github.com/gsoleilhac/NSGAII.jl")' @@ -37,4 +37,11 @@ RUN sudo julia -e 'using Pkg; Pkg.add("IJulia"); using IJulia' ADD packages.jl . RUN sudo chown -R jovyan $HOME RUN sudo chown -R jovyan $JULIA_PKGDIR +#RUN sudo /opt/conda/bin/pip install --upgrade numpy RUN julia packages.jl +RUN sudo /opt/conda/bin/conda install -f numpy +RUN sudo /opt/conda/bin/conda install nomkl numpy scipy scikit-learn numexpr +RUN sudo /opt/conda/bin/conda remove mkl mkl-service +RUN sudo /opt/conda/bin/conda update numpy +RUN sudo /opt/conda/bin/pip install git+git://github.com/BlueBrain/eFEL +RUN sudo /opt/conda/bin/pip install --upgrade allensdk From 7c905169438635f05a294aad9e405b9dc2f48914 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Thu, 13 Jun 2019 19:37:45 +1000 Subject: [PATCH 87/97] updating Dockerfile --- efel_dm/Dockerfile | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 efel_dm/Dockerfile diff --git a/efel_dm/Dockerfile b/efel_dm/Dockerfile new file mode 100644 index 0000000..d541ee8 --- /dev/null +++ b/efel_dm/Dockerfile @@ -0,0 +1,35 @@ +# author Russell Jarvis rjjarvis@asu.edu +# author Rick Gerkin rgerkin@asu.edu +# neuronunit-showcase + +FROM scidash/neuronunit-optimization +# RUN conda update -n base conda +USER $NB_USER + +# RUN pip uninstall tornado +# move to a docker install script. +RUN sudo /opt/conda/bin/pip install --upgrade pip +#RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade +#RUN sudo /opt/conda/bin/conda install -y cython + +RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git +# faster glif +# RUN sudo /opt/conda/bin/pip install allensdk --upgrade +# RUN sudo /opt/conda/bin/conda install -y numpy deap dask numba +# RUN sudo /opt/conda/bin/pip install allensdk --upgrade + +RUN sudo /opt/conda/bin/pip install git+git://github.com/BlueBrain/eFEL + +WORKDIR $HOME +RUN git clone https://github.com/AllenInstitute/sonata +WORKDIR src/pysonata +RUN python setup.py install + +RUN git clone https://github.com/AllenInstitute/bmtk.git +WORKDIR bmtk +RUN python setup.py install + +WORKDIR $HOME +RUN git clone https://github.com/fun-zoological-computing/AllenSDK +WORKDIR AllenSDK +RUN python setup.py install \ No newline at end of file From 70034f720d3b83aa3127bca6213c3817164eeb5d Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 24 Jun 2019 14:06:23 +1000 Subject: [PATCH 88/97] docker build for efel and allen --- efel_dm/Dockerfile | 37 +++++++++++++++++++++++++++++-------- efel_dm/Dockerfile~ | 31 +++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 efel_dm/Dockerfile~ diff --git a/efel_dm/Dockerfile b/efel_dm/Dockerfile index d541ee8..5c79284 100644 --- a/efel_dm/Dockerfile +++ b/efel_dm/Dockerfile @@ -3,14 +3,19 @@ # neuronunit-showcase FROM scidash/neuronunit-optimization +RUN sudo rm -rf /opt/conda/lib/python3.5/site-packages/setuptools-27.2.0-py3.5.egg +RUN sudo /opt/conda/bin/pip install --upgrade pip +RUN sudo /opt/conda/bin/pip install --upgrade setuptools +RUN sudo rm -rf /opt/conda/lib/python3.5/site-packages/allensdk-0.12.4.1-py3.5.egg +RUN pip install git+https://github.com/fun-zoological-computing/AllenSDK.git # RUN conda update -n base conda USER $NB_USER # RUN pip uninstall tornado # move to a docker install script. RUN sudo /opt/conda/bin/pip install --upgrade pip -#RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade -#RUN sudo /opt/conda/bin/conda install -y cython +# RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev # --upgrade# --process-dependency-links --upgrade +RUN sudo /opt/conda/bin/conda install -y cython RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git # faster glif @@ -21,15 +26,31 @@ RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git RUN sudo /opt/conda/bin/pip install git+git://github.com/BlueBrain/eFEL WORKDIR $HOME -RUN git clone https://github.com/AllenInstitute/sonata -WORKDIR src/pysonata -RUN python setup.py install +# RUN sudo /opt/conda/bin/pip install git+ +# RUN git clone https://github.com/AllenInstitute/sonata +# WORKDIR /sonata/src/pysonata +# RUN echo $pwd +# RUN ls *.py +# RUN python setup.py install RUN git clone https://github.com/AllenInstitute/bmtk.git WORKDIR bmtk RUN python setup.py install WORKDIR $HOME -RUN git clone https://github.com/fun-zoological-computing/AllenSDK -WORKDIR AllenSDK -RUN python setup.py install \ No newline at end of file +RUN sudo apt-get update -y +RUN sudo apt-get upgrade -y +RUN sudo apt-get -y install libhdf5-dev vim +# RUN sudo /opt/bin/conda/pip install setuptools +# RUN sudo /opt/conda/bin/pip install --upgrade protobuf + +# RUN git clone +# ing/AllenSDK +# WORKDIR AllenSDK +# RUN python setup.py install +RUN sudo /opt/conda/bin/pip3 install pyscaffold +RUN sudo /opt/conda/bin/pip install pip --upgrade +RUN sudo /opt/conda/bin/pip3 install SALib +# git+https://github.com/SALib/SALib.git + +ENTRYPOINT /bin/bash \ No newline at end of file diff --git a/efel_dm/Dockerfile~ b/efel_dm/Dockerfile~ new file mode 100644 index 0000000..6089b21 --- /dev/null +++ b/efel_dm/Dockerfile~ @@ -0,0 +1,31 @@ +# author Russell Jarvis rjjarvis@asu.edu +# author Rick Gerkin rgerkin@asu.edu +# neuronunit-showcase + +FROM scidash/neuronunit-optimization +# RUN conda update -n base conda +USER $NB_USER + +# RUN pip uninstall tornado +# move to a docker install script. +RUN sudo /opt/conda/bin/pip install --upgrade pip +#RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade +#RUN sudo /opt/conda/bin/conda install -y cython + +RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git +# faster glif +# RUN sudo /opt/conda/bin/pip install allensdk --upgrade +# RUN sudo /opt/conda/bin/conda install -y numpy deap dask numba +# RUN sudo /opt/conda/bin/pip install allensdk --upgrade + +RUN sudo /opt/conda/bin/pip install git+git://github.com/BlueBrain/eFEL + +WORKDIR $HOME +RUN git clone https://github.com/AllenInstitute/sonata +WORKDIR src/pysonata +RUN python setup.py install + +RUN git clone https://github.com/AllenInstitute/bmtk.git +WORKDIR bmtk +RUN python setup.py install + From 68ffdaa019d767fa04b7b819151c61d77745817c Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 24 Jun 2019 14:06:41 +1000 Subject: [PATCH 89/97] dev changes --- efel_dm/Dockerfile~ | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 efel_dm/Dockerfile~ diff --git a/efel_dm/Dockerfile~ b/efel_dm/Dockerfile~ deleted file mode 100644 index 6089b21..0000000 --- a/efel_dm/Dockerfile~ +++ /dev/null @@ -1,31 +0,0 @@ -# author Russell Jarvis rjjarvis@asu.edu -# author Rick Gerkin rgerkin@asu.edu -# neuronunit-showcase - -FROM scidash/neuronunit-optimization -# RUN conda update -n base conda -USER $NB_USER - -# RUN pip uninstall tornado -# move to a docker install script. -RUN sudo /opt/conda/bin/pip install --upgrade pip -#RUN sudo /opt/conda/bin/pip install git+https://github.com/scidash/sciunit.git@dev --process-dependency-links --upgrade -#RUN sudo /opt/conda/bin/conda install -y cython - -RUN sudo /opt/conda/bin/pip install git+https://github.com/brian-team/brian2.git -# faster glif -# RUN sudo /opt/conda/bin/pip install allensdk --upgrade -# RUN sudo /opt/conda/bin/conda install -y numpy deap dask numba -# RUN sudo /opt/conda/bin/pip install allensdk --upgrade - -RUN sudo /opt/conda/bin/pip install git+git://github.com/BlueBrain/eFEL - -WORKDIR $HOME -RUN git clone https://github.com/AllenInstitute/sonata -WORKDIR src/pysonata -RUN python setup.py install - -RUN git clone https://github.com/AllenInstitute/bmtk.git -WORKDIR bmtk -RUN python setup.py install - From 9a3282e6d289f37f38a37688c5f9319530d43d06 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Mon, 27 Jan 2020 18:45:19 +1100 Subject: [PATCH 90/97] merge back to be squashed --- with_julia/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/with_julia/Dockerfile b/with_julia/Dockerfile index 2b09486..89400ec 100644 --- a/with_julia/Dockerfile +++ b/with_julia/Dockerfile @@ -31,6 +31,7 @@ RUN julia -e 'import Pkg; Pkg.add("DataFrames")' RUN julia -e 'import Pkg; Pkg.add("Seaborn"); Pkg.add("PyPlot")' RUN julia -e 'import Pkg;Pkg.clone("https://github.com/gsoleilhac/NSGAII.jl")' +RUN julia -e 'import Pkg;Pkg.clone("https://github.com/fun-zoological-computing/SNN.jl")' USER jovyan # Precompile Julia packages \ RUN sudo julia -e 'using Pkg; Pkg.add("IJulia"); using IJulia' @@ -45,3 +46,4 @@ RUN sudo /opt/conda/bin/conda remove mkl mkl-service RUN sudo /opt/conda/bin/conda update numpy RUN sudo /opt/conda/bin/pip install git+git://github.com/BlueBrain/eFEL RUN sudo /opt/conda/bin/pip install --upgrade allensdk +RUN sudo /opt/conda/bin/pip install -e git+https://github.com/scidash/sciunit@dev From e82a696e3b0733029fb6cca824f928a0a541450a Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 8 May 2020 15:28:23 +1000 Subject: [PATCH 91/97] Delete Dockerfile --- Dockerfile | 110 ----------------------------------------------------- 1 file changed, 110 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 2bd2c07..0000000 --- a/Dockerfile +++ /dev/null @@ -1,110 +0,0 @@ -#author russell jarvis rjjarvis@asu.edu -#NEURON Dockerfile -#Set the base image to Ubuntu -FROM scidash/scipy-notebook-plus - -#Get a whole lot of GNU core development tools -#version control java development, maven -#Libraries required for building MPI from source -#Libraries required for building NEURON from source -#Also DO this part as root. -USER root - -RUN apt-get update && apt-get install -y wget bzip2 ca-certificates default-jre default-jdk maven emacs -RUN apt-get update; apt-get install -y automake libtool git vim \ - wget python3 libpython3-dev libncurses5-dev libreadline-dev libgsl0-dev cython3 \ - python3-pip python3-numpy python3-scipy python3-matplotlib python3-mock \ - ipython3 python3-docutils python3-yaml \ - python3-venv python3-mpi4py python3-tables cmake ssh - - - - -#The following code is adapted from: -#https://github.com/ContinuumIO/docker-images/blob/master/anaconda/Dockerfile - - -#Do the rest of the build as user: -#This will create a more familiar environment to continue developing in. -#with less of a need to chown and chmod everything done as root at dockerbuild completion - -#RUN apt-get update \ -# && apt-get install -y sudo \ -# && rm -rf /var/lib/apt/lists/* -#RUN echo "jovyan ALL=NOPASSWD: ALL" >> /etc/sudoers - -USER jovyan -WORKDIR /home/jovyan -RUN sudo chown -R jovyan /home/jovyan -ENV HOME /home/jovyan -#ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH -RUN sudo /opt/conda/bin/conda install scipy numpy matplotlib - -#Test matplotlib -#RUN python -c "import matplotlib" -#Install General MPI, such that mpi4py can later bind with it. -WORKDIR /home/jovyan - -WORKDIR $HOME -RUN \ - wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.4/nrn-7.4.tar.gz && \ - tar -xzf nrn-7.4.tar.gz && \ - rm nrn-7.4.tar.gz - -WORKDIR $HOME/nrn-7.4 -RUN whereis python3 -RUN which mpirun -ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH -#RUN ls -ltr configure -RUN ./configure --prefix=`pwd` --with-paranrn --without-iv --with-nrnpython=/usr/bin/python3 -RUN sudo make all && \ - make install -ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH - - - -ENV HOME /home/docker -ENV PATH $HOME/nrn-7.4/x86_64/bin:$PATH -ENV PATH /opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH - - - -USER jovyan - - - - -WORKDIR $HOME/git -#TODO change back to this repository, once pull request as accepted for python3 compliant code -#RUN sudo git clone https://github.com/NeuroML/jNeuroML -RUN sudo git clone https://github.com/russelljjarvis/jNeuroML.git -WORKDIR $HOME/git/jNeuroML -RUN sudo python getNeuroML.py - -RUN sudo chown -R jovyan /home/jovyan -WORKDIR /home/jovyan/nrn-7.4/src/parallel -RUN mpiexec -np 4 nrniv -mpi test0.hoc -RUN mpiexec -np 4 nrniv -mpi test1.hoc -RUN mpiexec -np 4 nrniv -mpi test2.hoc -RUN mpiexec -np 4 nrniv -mpi test3.hoc -RUN mpiexec -np 4 nrniv -mpi test4.hoc -RUN mpiexec -np 4 nrniv -mpi test5.hoc -RUN mpiexec -np 4 nrniv -mpi test6.hoc -RUN mpiexec -np 4 nrniv -mpi test7.hoc - -ADD ./test_fixed.py /home/docker/nrn-7.4/src/parallel/ -RUN mpiexec -np 4 nrniv -mpi -python test_fixed.py -RUN sudo pip3 install zmq -RUN sudo pip3 install packaging -RUN sudo pip3 install --upgrade pip#notebook -RUN sudo pip3 install notebook -RUN sudo pip3 install ipyparallel -RUN sudo ipcluster nbextension enable -RUN sudo ipython profile create chase -RUN ipcluster start -n 4 --engines=MPIEngineSetLauncher -#RUN sudo ipcluster start --profile=chase --debug & -RUN mpiexec -n 4 ipengine --mpi=mpi4py - -RUN sudo chown -R jovyan /home/jovyan/work -ENV QT_QPA_PLATFORM offscreen -ENV PYTHONPATH $PYTHONPATH/home/jovyan/work/neuronunit/neuronunit/optimization From d7797d52090344dabae10b239b85e5745402f95c Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 8 May 2020 15:34:19 +1000 Subject: [PATCH 92/97] Create Dockerfile --- Dockerfile | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..98d25f5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +# Distributed under the terms of the Modified BSD License. +ARG BASE_CONTAINER=jupyter/scipy-notebook +FROM $BASE_CONTAINER +LABEL maintainer="Russell " +USER root +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + fonts-dejavu \ + gfortran \ + gcc && \ + rm -rf /var/lib/apt/lists/* +RUN apt-get upgrade +RUN apt-get install -y ncurses-base ncurses-bin +RUN apt-get update && apt-get install -y bzip2 ca-certificates automake libtool \ + libncurses5-dev libreadline-dev libgsl0-dev cmake ssh +USER jovyan + +WORKDIR $HOME +RUN \ + wget http://www.neuron.yale.edu/ftp/neuron/versions/v7.7/nrn-7.7.tar.gz && \ + tar -xzf nrn-7.7.tar.gz && \ + rm nrn-7.7.tar.gz +WORKDIR $HOME/nrn-7.7 +ENV PATH /usr/bin/python3/python:/opt/conda/bin:/opt/conda/bin/conda:/opt/conda/bin/python:$PATH +RUN ./configure --prefix=`pwd` --without-iv --with-nrnpython=/opt/conda/bin/python3 +USER root +RUN sudo make all && \ + make install +USER jovyan +WORKDIR src/nrnpython +RUN python setup.py install +RUN python -c "import neuron" +ENV NEURON_HOME $HOME/nrn-7.7/x86_64 +ENV PATH $NEURON_HOME/bin:$PATH From 85a1e14d37cb42bae874cafcb4dce4c36fe7a52e Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 8 May 2020 15:34:57 +1000 Subject: [PATCH 93/97] Update .travis.yml --- .travis.yml | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 16b94cb..ebaf34b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,19 @@ language: python + python: - - "3.5" -sudo: required + - 3.6 services: - docker - - git - - python - -before_script: - - cd ParallelPyNEURON - - docker build -t ppn . -script: - - docker run -it ppn bash + +os: + - linux + + +notifications: + email: true + +before_install: + - docker build -t pns . +script: + - docker run pns python $HOME/work/PyPNS/test.py From 31a8ceea564529c90a4996af7dbf78c786a49b05 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 8 May 2020 16:00:20 +1000 Subject: [PATCH 94/97] Update .travis.yml --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ebaf34b..c23fa4a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,5 +15,4 @@ notifications: before_install: - docker build -t pns . script: - - docker run pns python $HOME/work/PyPNS/test.py - + - docker run pns python -c "print('built')" From 1259b672400ab9fa1466931bae03be7400218fc5 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 8 May 2020 16:00:39 +1000 Subject: [PATCH 95/97] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2afc0b1..914e073 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://travis-ci.com/russelljjarvis/docker-stacks-returned.svg?branch=scidash)](https://travis-ci.com/russelljjarvis/docker-stacks-returned) + # A hierarchy of Docker images for using SciDash tools Purpose: The building of development environments raises an unnecessary technical problem. In many cases even if someone has the technical capacity to build, it does not mean they will have time to do so. In order to remove this barrier to participation we have created some Docker images to allow people to use our tools. Each of these images serves Jupyter notebooks and including a Python scientific computing stack (extended from jupyter/docker-stacks/scipy-notebook), and some combination of NEURON-7.4, scoop, DEAP, sciunit, and neuronunit. From 4fe19d46e49ac2a7e303dc1be49762ac4887b008 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Fri, 8 May 2020 16:01:37 +1000 Subject: [PATCH 96/97] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 914e073..cc83ecd 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # A hierarchy of Docker images for using SciDash tools -Purpose: The building of development environments raises an unnecessary technical problem. In many cases even if someone has the technical capacity to build, it does not mean they will have time to do so. In order to remove this barrier to participation we have created some Docker images to allow people to use our tools. Each of these images serves Jupyter notebooks and including a Python scientific computing stack (extended from jupyter/docker-stacks/scipy-notebook), and some combination of NEURON-7.4, scoop, DEAP, sciunit, and neuronunit. +Purpose: The building of development environments raises an unnecessary technical problem. In many cases even if someone has the technical capacity to build, it does not mean they will have time to do so. In order to remove this barrier to participation we have created some Docker images to allow people to use our tools. Each of these images serves Jupyter notebooks and including a Python scientific computing stack (extended from jupyter/docker-stacks/scipy-notebook), and some combination of NEURON-7.7, DASK, DEAP, sciunit, and neuronunit. ![Docker container hierarchy](https://github.com/scidash/assets/blob/master/mockups/Containerization%20and%20Continuous%20Integration%20Workflow.png) From 0b0fad4212dbd6ed9c8f5c24cc15bb7dfc5ee822 Mon Sep 17 00:00:00 2001 From: Russell Jarvis Date: Sat, 9 May 2020 13:03:50 +1000 Subject: [PATCH 97/97] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index cc83ecd..655db92 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ [![Build Status](https://travis-ci.com/russelljjarvis/docker-stacks-returned.svg?branch=scidash)](https://travis-ci.com/russelljjarvis/docker-stacks-returned) +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/russelljjarvis/docker-stacks-returned/master) + # A hierarchy of Docker images for using SciDash tools Purpose: The building of development environments raises an unnecessary technical problem. In many cases even if someone has the technical capacity to build, it does not mean they will have time to do so. In order to remove this barrier to participation we have created some Docker images to allow people to use our tools. Each of these images serves Jupyter notebooks and including a Python scientific computing stack (extended from jupyter/docker-stacks/scipy-notebook), and some combination of NEURON-7.7, DASK, DEAP, sciunit, and neuronunit.