# 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 " 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"]