Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
80 changes: 80 additions & 0 deletions images/Dockerfile.openscope
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
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
RUN apt-get install -y libgl1
RUN apt-get install -y libglx-mesa0
RUN apt-get install -y libglib2.0-0
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf /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