An incomplete base Docker image for running JupyterHub
Add your configuration to create a complete derivative Docker image.
Include your configuration settings by starting with one of two options:
Option 1:
FROM jupyterhub/jupyterhub:latest
And put your configuration file jupyterhub_config.py in /srv/jupyterhub/jupyterhub_config.py.
Option 2:
Or you can create your jupyterhub config and database on the host machine, and mount it with:
docker run -v $PWD:/srv/jupyterhub -t jupyterhub/jupyterhub
NOTE
If you base on jupyterhub/jupyterhub-onbuild
your jupyterhub_config.py will be added automatically
from your docker directory.
######################################################################
This Dockerfile uses multi-stage builds with optimisations to build
the JupyterHub wheel on the native architecture only
https://www.docker.com/blog/faster-multi-platform-builds-dockerfile-cross-compilation-guide/
ARG BASE_IMAGE=ubuntu:22.04
######################################################################
The JupyterHub wheel is pure Python so can be built for any platform
on the native architecture (avoiding QEMU emulation)
FROM --platform=${BUILDPLATFORM:-linux/amd64} $BASE_IMAGE AS jupyterhub-builder
ENV DEBIAN_FRONTEND=noninteractive
Don't clear apt cache, and don't combine RUN commands, so that cached layers can
be reused in other stages
RUN apt-get update -qq
&& apt-get install -yqq --no-install-recommends
build-essential
ca-certificates
curl
locales
python3-dev
python3-pip
python3-pycurl
python3-venv
&& python3 -m pip install --no-cache-dir --upgrade setuptools pip build wheel
Ubuntu 22.04 comes with Nodejs 12 which is too old for building JupyterHub JS
It's fine at runtime though (used only by configurable-http-proxy)
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
&& apt-get install -yqq --no-install-recommends
nodejs
&& npm install --global yarn
WORKDIR /src/jupyterhub
copy everything except whats in .dockerignore, its a
compromise between needing to rebuild and maintaining
what needs to be part of the build
COPY . .
ARG PIP_CACHE_DIR=/tmp/pip-cache
RUN --mount=type=cache,target=${PIP_CACHE_DIR}
python3 -m build --wheel
######################################################################
All other wheels required by JupyterHub, some are platform specific
FROM $BASE_IMAGE AS wheel-builder
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -qq
&& apt-get install -yqq --no-install-recommends
build-essential
ca-certificates
curl
locales
python3-dev
python3-pip
python3-pycurl
python3-venv
&& python3 -m pip install --no-cache-dir --upgrade setuptools pip build wheel
WORKDIR /src/jupyterhub
COPY --from=jupyterhub-builder /src/jupyterhub/dist/.whl /src/jupyterhub/dist/
ARG PIP_CACHE_DIR=/tmp/pip-cache
RUN --mount=type=cache,target=${PIP_CACHE_DIR}
python3 -m pip wheel --wheel-dir wheelhouse dist/.whl
######################################################################
The final JupyterHub image, platform specific
FROM $BASE_IMAGE AS jupyterhub
ENV DEBIAN_FRONTEND=noninteractive
SHELL=/bin/bash
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
PYTHONDONTWRITEBYTECODE=1
EXPOSE 8000
LABEL maintainer="Jupyter Project jupyter@googlegroups.com" LABEL org.jupyter.service="jupyterhub"
WORKDIR /srv/jupyterhub
RUN apt-get update -qq
&& apt-get install -yqq --no-install-recommends
ca-certificates
curl
gnupg
locales
python-is-python3
python3-pip
python3-pycurl
nodejs
npm
&& locale-gen $LC_ALL
&& npm install -g configurable-http-proxy@^4.2.0 \
clean cache and logs
&& rm -rf /var/lib/apt/lists/* /var/log/* /var/tmp/* ~/.npm
install the wheels we built in the previous stage
RUN --mount=type=cache,from=wheel-builder,source=/src/jupyterhub/wheelhouse,target=/tmp/wheelhouse
# always make sure pip is up to date!
python3 -m pip install --no-compile --no-cache-dir --upgrade setuptools pip
&& python3 -m pip install --no-compile --no-cache-dir /tmp/wheelhouse/*
CMD ["jupyterhub"]