Skip to content

Instantly share code, notes, and snippets.

@fcollonval
Last active September 5, 2022 08:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fcollonval/facfadcd926621a84556a040aac71a8f to your computer and use it in GitHub Desktop.
Save fcollonval/facfadcd926621a84556a040aac71a8f to your computer and use it in GitHub Desktop.
JupyterLab custom menu

Customized JupyterLab

This is an example of JupyterLab UI customization.

Test it online: Binder

Requirement: JupyterLab >= 3.4

What is demonstrated?

  • Context menu:

    • Disable the context menu entry Create console (available normally when right clicking on a panel tab).
  • Main menu:

    • Disable Run menu
    • Remove command Open path from the file menu
  • Toolbars:

    • Notebook:
      • Remove button Restart and run all
      • Add button Clear all outputs
    • Cell:
      • Add a clear cell output button
{
"@jupyterlab/application-extension:context-menu": {
"contextMenu": [
{
"command": "filemenu:create-console",
"selector": "[data-type=\"document-title\"].jp-mod-current",
"disabled": true
}
]
},
"@jupyterlab/mainmenu-extension:plugin": {
"menus": [
{
"id": "jp-mainmenu-run",
"disabled": true
},
{
"id": "jp-mainmenu-tabs",
"rank": 1100
},
{
"id": "jp-mainmenu-file",
"items": [
{
"command": "filebrowser:open-path",
"disabled": true
}
]
}
]
},
"@jupyterlab/notebook-extension:panel": {
"toolbar": [
{ "name": "restart-and-run", "disabled": true },
{ "name": "clear-all-outputs", "command": "notebook:clear-all-cell-outputs" }
]
},
"@jupyterlab/cell-toolbar-extension:plugin": {
"toolbar": [
{ "name": "clear-output", "command":"notebook:clear-cell-output", "icon": "ui-components:close" }
]
}
}
#!/usr/bin/env bash
set -eux
mkdir -p ${NB_PYTHON_PREFIX}/share/jupyter/lab/settings
cp overrides.json ${NB_PYTHON_PREFIX}/share/jupyter/lab/settings
jupyterlab>=3.4.0rc0,<4.0.0a0
@fcollonval
Copy link
Author

Bump to 3.4 and add example to customize the cell toolbar

@wangfan860
Copy link

Hello, I'm trying to override the default markdown preview. My Jupyter docker file looks like this:

# Distributed under the terms of the Modified BSD License.

# Ubuntu 20.04 (focal)
# https://hub.docker.com/_/ubuntu/?tab=tags&name=focal
ARG ROOT_CONTAINER=quay.io/cdis/ubuntu:focal

FROM $ROOT_CONTAINER

LABEL maintainer="Jupyter Project <jupyter@googlegroups.com>"
ARG NB_USER="jovyan"
ARG NB_UID="1000"
ARG NB_GID="100"

# Fix DL4006
SHELL ["/bin/bash", "-o", "pipefail", "-c"]

USER root

# ---- Miniforge installer ----
# Default values can be overridden at build time
# (ARGS are in lower case to distinguish them from ENV)
# Check https://github.com/conda-forge/miniforge/releases
# Conda version
ARG conda_version="4.10.3"
# Miniforge installer patch version
ARG miniforge_patch_number="3"
# Package Manager and Python implementation to use (https://github.com/conda-forge/miniforge)
# - conda only: either Miniforge3 to use Python or Miniforge-pypy3 to use PyPy
# - conda + mamba: either Mambaforge to use Python or Mambaforge-pypy3 to use PyPy
ARG miniforge_python="Mambaforge"
# Miniforge archive to install
ARG miniforge_version="${conda_version}-${miniforge_patch_number}"


# Install all OS dependencies for notebook server that starts but lacks all
# features (e.g., download as all possible file formats)
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update --yes && \
    apt-get install --yes --no-install-recommends \
    tini \
    wget \
    git \
    curl \
    ca-certificates \
    sudo \
    locales \
    fonts-liberation \
    vim \
    run-one && \
    apt-get clean && rm -rf /var/lib/apt/lists/* && \
    echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen

# Configure environment
ENV CONDA_DIR=/opt/conda \
    SHELL=/bin/bash \
    NB_USER="${NB_USER}" \
    NB_UID=${NB_UID} \
    NB_GID=${NB_GID} \
    LC_ALL=en_US.UTF-8 \
    LANG=en_US.UTF-8 \
    LANGUAGE=en_US.UTF-8

ENV PATH="${CONDA_DIR}/bin:${PATH}" \
    HOME="/home/${NB_USER}" \
    CONDA_VERSION="${conda_version}" \
    MINIFORGE_VERSION="${miniforge_version}"

# Copy a script that we will use to correct permissions after running certain commands
COPY resources/scripts/fix-permissions /usr/local/bin/fix-permissions
RUN chmod a+rx /usr/local/bin/fix-permissions

# Enable prompt color in the skeleton .bashrc before creating the default NB_USER
# hadolint ignore=SC2016
RUN sed -i 's/^#force_color_prompt=yes/force_color_prompt=yes/' /etc/skel/.bashrc && \
    # Add call to conda init script see https://stackoverflow.com/a/58081608/4413446
    echo 'eval "$(command conda shell.bash hook 2> /dev/null)"' >> /etc/skel/.bashrc


# Create NB_USER with name jovyan user with UID=1000 and in the 'users' group
# and make sure these dirs are writable by the `users` group.
RUN echo "auth requisite pam_deny.so" >> /etc/pam.d/su && \
    sed -i.bak -e 's/^%admin/#%admin/' /etc/sudoers && \
    sed -i.bak -e 's/^%sudo/#%sudo/' /etc/sudoers && \
    useradd -l -m -s /bin/bash -N -u "${NB_UID}" "${NB_USER}" && \
    mkdir -p "${CONDA_DIR}" && \
    chown "${NB_USER}:${NB_GID}" "${CONDA_DIR}" && \
    chmod g+w /etc/passwd && \
    fix-permissions "${HOME}" && \
    fix-permissions "${CONDA_DIR}"

USER ${NB_UID}
ARG PYTHON_VERSION=default


# Install conda as jovyan and check the sha256 sum provided on the download site
WORKDIR /tmp

# Prerequisites installation: conda, mamba, pip, tini
RUN set -x && \
    # Miniforge installer
    miniforge_arch=$(uname -m) && \
    export miniforge_arch && \
    if [ "$miniforge_arch" == "aarm64" ]; then \
    miniforge_arch="arm64"; \
    fi; \
    miniforge_installer="${miniforge_python}-${miniforge_version}-Linux-${miniforge_arch}.sh" && \
    export miniforge_installer && \
    wget --quiet "https://github.com/conda-forge/miniforge/releases/download/${miniforge_version}/${miniforge_installer}" && \
    /bin/bash "${miniforge_installer}" -f -b -p "${CONDA_DIR}" && \
    rm "${miniforge_installer}" && \
    # Conda configuration see https://conda.io/projects/conda/en/latest/configuration.html
    echo "conda ${CONDA_VERSION}" >> "${CONDA_DIR}/conda-meta/pinned" && \
    conda config --system --set auto_update_conda false && \
    conda config --system --set show_channel_urls true && \
    if [[ "${PYTHON_VERSION}" != "default" ]]; then conda install --yes python="${PYTHON_VERSION}"; fi && \
    conda list python | grep '^python ' | tr -s ' ' | cut -d ' ' -f 1,2 >> "${CONDA_DIR}/conda-meta/pinned" && \
    conda install --quiet --yes \
    "conda=${CONDA_VERSION}" \
    'pip' && \
    conda update --all --quiet --yes && \
    conda clean --all -f -y && \
    rm -rf "/home/${NB_USER}/.cache/yarn" && \
    fix-permissions "${CONDA_DIR}" && \
    fix-permissions "/home/${NB_USER}"

# Install Jupyter Notebook, Lab, and Hub
# Generate a notebook server config
# Cleanup temporary files
# Correct permissions
# Do all this in a single RUN command to avoid duplicating all of the
# files across image layers when the permissions change
RUN conda install --quiet --yes \
    'notebook' \
    'jupyterhub' \
    'jupyterlab' && \
    conda clean --all -f -y && \
    npm cache clean --force && \
    jupyter notebook --generate-config && \
    jupyter lab clean && \
    rm -rf "/home/${NB_USER}/.cache/yarn" && \
    fix-permissions "${CONDA_DIR}" && \
    fix-permissions "/home/${NB_USER}"

EXPOSE 8888

# Configure container startup
ENTRYPOINT ["tini", "-g", "--"]
CMD ["start-notebook.sh"]

# Copy local files as late as possible to avoid cache busting
COPY resources/scripts/jupyter/ /usr/local/bin/
# Currently need to have both jupyter_notebook_config and jupyter_server_config to support classic and lab
COPY resources/jupyter_notebook_config.py /etc/jupyter/
# Do not open notebooks in a new tab: https://github.com/jupyter/notebook/issues/4115
COPY resources/custom.js /home/$NB_USER/.jupyter/custom/
# Use overrides.json file to change the default settings
RUN mkdir -p /opt/conda/share/jupyter/lab/settings
COPY resources/overrides.json /opt/conda/share/jupyter/lab/settings
#JupyterLab application directory is /opt/conda/share/jupyter/lab

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

# Fix permissions on /etc/jupyter as root
USER root

# Prepare upgrade to JupyterLab V3.0 #1205
RUN sed -re "s/c.NotebookApp/c.ServerApp/g" \
    /etc/jupyter/jupyter_notebook_config.py > /etc/jupyter/jupyter_server_config.py && \
    fix-permissions /etc/jupyter/

# Switch back to jovyan to avoid accidental container runs as root
USER ${NB_UID}

WORKDIR "${HOME}"

and my overrides.json file is:

{
  "@jupyterlab/docmanager-extension:plugin": {
    "defaultViewers": 
      {
        markdown: "Markdown Preview"
      }
  }
}

when I test locally, the rm file opens with editor not markdown preview. Am I doing sth wrong? Thanks so much!!

@fcollonval
Copy link
Author

Presumably the error is due to invalid JSON syntax (all strings must be double quoted in JSON):

{
  "@jupyterlab/docmanager-extension:plugin": {
    "defaultViewers": 
      {
        "markdown": "Markdown Preview"
      }
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment