Jupyter is a crazy awesome. Head over to tmpnb.org to try it out. waits Have fun playing with Python? Or did you maybe learn yourself a Haskell for great good? Hopefully it’s obvious that Jupyter is not only a cool concept, but a pretty damn powerful one too.
I’ve been digging into JupyterHub lately, specifically toying with running it on Carina because I like to Docker ALL THE THINGS! By pairing them up, when a user logs into the Jupyter hub, a Carina cluster is created on-the-fly to run that user’s personal Jupyter server. It’s Jupyter + bring your own compute.
Jupyter Stacks are opinionated stacks of ready-to-run Jupyter applications in Docker, and are useful when you want to use bare minimum necessary to run a notebook (hint: minimal-notebook) or grab something off-the-shelf for a particular language. Here’s how you can build a Docker image based on a Jupyter Stack that works with JupyterHub:
Pick the stack that you would like to use, such as
minimal-notebook
.Make a Dockerfile with the following contents. Replace
<stack>
with the name of your Jupyter Stack.FROM jupyter/<stack> # Setup the JupyterHub single user entrypoint USER root RUN wget -q https://raw.githubusercontent.com/jupyter/jupyterhub/master/scripts/jupyterhub-singleuser -O /usr/local/bin/jupyterhub-singleuser && \ chmod 755 /usr/local/bin/jupyterhub-singleuser && \ mkdir -p /srv/singleuser/ && \ wget -q https://raw.githubusercontent.com/jupyter/dockerspawner/master/singleuser/singleuser.sh -O /srv/singleuser/singleuser.sh && \ chmod 755 /srv/singleuser/singleuser.sh # Verify that the JupyterHub entrypoint works USER jovyan RUN sh /srv/singleuser/singleuser.sh -h # Configure the JupyterHub entrypoint CMD ["sh", "/srv/singleuser/singleuser.sh"]
Note: The black magic voodoo is copied from Jupyter/DockerSpawner’s singleuser Dockerfile and hopefully shouldn’t change often enough to matter.
Connect to your docker host and run the following commands. Replace
<docker-hub-user>
with your Docker Hub username and<stack>
with the name of your Jupyter Stack.docker build -t <docker-hub-user>/<stack> . docker push <docker-hub-user>/<stack>
Update your JupyterHub configuration to use your custom Docker image when it creates user servers:
jupyter-config.py
import os c = get_config() c.DockerSpawner.container_image = "<docker-hub-user>/<stack>" # ... Do the rest of your usual configuration