Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Allen Institute OpenScope image #233

Merged
merged 12 commits into from
Feb 19, 2025
4 changes: 3 additions & 1 deletion .github/workflows/docker-push.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ jobs:
include:
- tag: latest
dockerfile: Dockerfile
- tag: latest
dockerfile: Dockerfile.openscope
- tag: latest-allensdk
dockerfile: Dockerfile.allensdk
- tag: latest-gpu
Expand Down Expand Up @@ -51,4 +53,4 @@ jobs:
tags: |
${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:${{ matrix.tag }}
cache-from: type=registry,ref=${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:${{ matrix.tag }}
cache-to: type=inline
cache-to: type=inline
4 changes: 3 additions & 1 deletion .github/workflows/docker-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ jobs:
include:
- tag: latest
dockerfile: Dockerfile
- tag: latest
dockerfile: Dockerfile.openscope
- tag: latest-allensdk
dockerfile: Dockerfile.allensdk
- tag: latest-gpu
Expand All @@ -41,4 +43,4 @@ jobs:
file: ./images/${{ matrix.dockerfile }}
push: false
cache-from: type=registry,ref=${{ secrets.DOCKERHUB_DANDIHUB_USERNAME }}/dandihub:${{ matrix.tag }}
cache-to: type=inline
cache-to: type=inline
6 changes: 6 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.PHONY: dev
OCI_ENGINE?= podman
dev-image:
@echo "Building development image from $(CONTAINERFILE)..."
$(OCI_ENGINE) build -f $(CONTAINERFILE) -t dev-image:latest .
$(OCI_ENGINE) run --rm -p 8888:8888 --name dev_jupyterlab dev-image:latest start-notebook.sh --NotebookApp.token=""
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ This Terraform blueprint creates a Kubernetes environment (EKS) and installs Jup
- [Adjusting Core Node](#adjusting-core-node)
- [Upgrading Kubernetes](#upgrading-kubernetes)
- [Kubernetes Layer Tour](#kubernetes-layer-tour)
- [Additional Image options](#creating-images)

## Prerequisites

Expand Down Expand Up @@ -447,3 +448,11 @@ Finally, remove the ec2 instance.
```sh
./.github/scripts/cleanup-ec2.sh
```

## Creating Additional Images

The following command will build and run a new image, which can be viewed locally in the browser at 127.0.0.1:8888/

```sh
make dev-image CONTAINERFILE=images/Dockerfile.openscope
```
25 changes: 25 additions & 0 deletions envs/shared/jupyterhub.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ singleuser:
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-allensdk"
openscope:
display_name: "OpenScope"
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-openscope"
kubespawner_override:
image_pull_policy: Always
cpu_limit: 2
Expand Down Expand Up @@ -109,6 +114,11 @@ singleuser:
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-allensdk"
openscope:
display_name: "OpenScope"
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-openscope"
matlab:
display_name: "MATLAB (must provide your own license)"
kubespawner_override:
Expand Down Expand Up @@ -143,6 +153,11 @@ singleuser:
display_name: "MATLAB (must provide your own license)"
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-matlab"
openscope:
display_name: "OpenScope"
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-openscope"
kubespawner_override:
image_pull_policy: Always
cpu_limit: 24
Expand All @@ -167,6 +182,11 @@ singleuser:
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-allensdk"
openscope:
display_name: "OpenScope"
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-openscope"
matlab:
display_name: "MATLAB (must provide your own license)"
kubespawner_override:
Expand Down Expand Up @@ -195,6 +215,11 @@ singleuser:
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-gpu-allensdk"
openscope:
display_name: "OpenScope"
default: true
kubespawner_override:
image: "${singleuser_image_repo}:${singleuser_image_tag}-openscope"
matlab:
display_name: "MATLAB GPU (must provide your own license)"
kubespawner_override:
Expand Down
75 changes: 75 additions & 0 deletions images/Dockerfile.openscope
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
FROM quay.io/jupyter/datascience-notebook:python-3.11.10

USER root

RUN apt update \
&& apt install -y software-properties-common \
&& add-apt-repository -y 'ppa:apptainer/ppa' \
&& apt update \
&& apt install -y apptainer-suid \
&& rm -rf /var/lib/apt/lists/* && rm -rf /tmp/*

RUN apt-get update && apt-get install -y ca-certificates libseccomp2 \
s3fs netbase less parallel tmux screen vim emacs htop curl \
&& rm -rf /var/lib/apt/lists/* && rm -rf /tmp/*

RUN curl --silent --show-error "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \
-o "awscliv2.zip" && unzip awscliv2.zip \
&& ./aws/install && rm -rf ./aws awscliv2.zip

# Install jupyter server proxy and desktop
RUN curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main"|sudo tee /etc/apt/sources.list.d/brave-browser-release.list \
&& apt-get -y -qq update \
&& apt-get -y -qq install \
dbus-x11 \
xfce4 \
xfce4-panel \
xfce4-session \
xfce4-settings \
xorg \
xubuntu-icon-theme \
brave-browser \
tigervnc-standalone-server \
tigervnc-xorg-extension \
# chown $HOME to workaround that the xorg installation creates a
# /home/jovyan/.cache directory owned by root
&& chown -R $NB_UID:$NB_GID $HOME \
&& rm -rf /var/lib/apt/lists/* && rm -rf /tmp/*

# apt-get may result in root-owned directories/files under $HOME
RUN mkdir /opt/extras && chown -R $NB_UID:$NB_GID $HOME /opt/extras

USER $NB_USER

RUN pip install --no-cache-dir jupyter-remote-desktop-proxy

ENV MAMBA_NO_LOW_SPEED_LIMIT=1

RUN mamba install --yes 'datalad>=0.18' rclone 'h5py>3.3=mpi*' ipykernel zarr blosc eccodes websockify \
&& wget --quiet https://raw.githubusercontent.com/DanielDent/git-annex-remote-rclone/v0.8/git-annex-remote-rclone \
&& chmod +x git-annex-remote-rclone && mv git-annex-remote-rclone /opt/conda/bin \
&& conda clean --all -f -y && rm -rf /tmp/*

RUN pip install --no-cache-dir -U plotly jupyter_bokeh jupytext nbgitpuller datalad_container \
datalad-osf dandi nibabel nilearn pybids spikeinterface neo itkwidgets \
'pydra>=0.25' 'pynwb>=2.8.3' 'nwbwidgets>=0.10.2' hdf5plugin s3fs h5netcdf "xarray[io]" \
aicsimageio kerchunk 'neuroglancer>=2.28' cloud-volume ipywidgets ome-zarr \
webio_jupyter_extension https://github.com/balbasty/dandi-io/archive/refs/heads/main.zip \
tensorstore anndata

RUN pip install --no-cache-dir multiscale_spatial_image jupyterlab-git \
datalad-fuse

RUN pip install --no-cache-dir brainrender napari

# Leaving "standard" Dockerfile copy above as-is to simplify later switch to modular builds.
USER root

RUN apt-get install -y coreutils libgl1 libglx-mesa0 libglib2.0-0 && rm -rf /var/lib/apt/lists/* /tmp/*

USER $NB_USER

RUN cd /tmp \
&& git clone https://github.com/AllenInstitute/openscope_databook.git \
&& pip install --no-cache-dir -e './openscope_databook[dev]'
Loading