Skip to main content

jupyterhub-roothooks

Tests passing codecov PyPI version pre-commit.ci status

Run hooks as root before starting user server.

Why?

When running JupyterHub on Kubernetes, you want user pods to run as non-root users. This is good security practice, and can seriously reduce blast radius in case of compromised. For example, if you run your containers with privileged: True, a compromise of a user server will likely be able to take control of your entire kubernetes cluster, and depending on how it's configured, your cloud account! Nobody wants that.

However, what people do want is to be able to run some commands as root before the user server starts. Often, this is to do some mounting stuff, although there are other use cases too.

So the goal would be to:

  1. Run some commands as root before the user server starts
  2. These commands failing should not cause the server to not start. This mostly shows the user a useless 'your server has failed to start' error. In most cases, it is better to start the server and provide some logging so the user can investigate what went wrong.

jupyterhub-roothooks is designed to solve this very specific problem.

How?

Prepare the image: With repo2docker

repo2docker is a common way to build images for use with JupyterHub, so jupyterhub-roothooks specifies some defaults that make it easy to integrate with repo2docker.

  1. Install jupyterhub-roothooks into your container, by adding it to your requirements.txt file or under pip: in your environment.yml file.

  2. Add a roothooks.d directory to your repo.

  3. Add scripts you want executed as root inside the roothooks.d directory. These will be executed in sorted order, so you can clarify the ordering by prefixing them with numbers like 01-first-script.sh, 02-second-script.sh.

  4. Make sure these scripts are marked as executable (with chmod +x <script-name>), and have an appropriate shebang.

  5. Add a start script that looks like this:

    #!/bin/bash -l
    exec jupyterhub-roothooks --uid 1000 --gid 1000 -- "$@"
    

    This will start jupyterhub-roothooks, which will execute any executable scripts it finds in roothooks.d, and then run the appropriate command to start the user server (passed in via $@) with the non-root uid 1000 and gid 1000.

z2jh configuration

Now that the image is prepared, you can grant elevated root capabilities to the user pod via z2jh config. Note that while the container will have these capabilities, the user server itself will not. jupyterhub-roothooks will drop these capabilities before starting the user server.

hub:
    config:
        KubeSpawner:
            container_security_context:
                # Run the container *truly* as privileged. This can be very dangerous,
                # but is required for doing most filesystem mounts
                privileged: true
                runAsUser: 0
                allowPrivilegeEscalation: true
                capabilities:
                    add:
                    - SYS_ADMIN

Metadata

Release files for jupyterhub-roothooks 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jupyterhub-roothooks 0.2.1
File Size Uploaded
jupyterhub-roothooks-0.2.1.tar.gz 5.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jupyterhub-roothooks 0.2.1
File Interpreter ABI Platform
jupyterhub_roothooks-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 12.0 kB

Release files / jupyterhub-roothooks-0.2.1.tar.gz

Download URL jupyterhub-roothooks-0.2.1.tar.gz
Size 5.0 kB
Tags Source
SHA-256 checksum
How to use checksums
4db8894ca5f4867ff31e5fbc27f12a5cb824b3d86e5524465a6707e1744d8e38
BLAKE2b-256 checksum
How to use checksums
4c4aa65afdad1f78c38bef36fc0e496a98bc4c79b55d548dbf1479ad9ee16749
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.10.4

Release files / jupyterhub_roothooks-0.2.1-py3-none-any.whl

Download URL jupyterhub_roothooks-0.2.1-py3-none-any.whl
Size 6.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3744dcccd01bc0bb6560517dd82034259dcbd7ca98e23ca13690cb98a25653fd
BLAKE2b-256 checksum
How to use checksums
66c4088d7fe454494ed75ace147f37541395c160209277aa8c569b818d327167
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.10.4

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page