From 1fe7a4d60668f5523534429a52f1ca0ecd88ca23 Mon Sep 17 00:00:00 2001 From: Mahmoud Saada Date: Wed, 25 Feb 2026 10:36:31 -0500 Subject: [PATCH 1/7] Add JupyterHub singleuser support and jupyter-vscode-proxy Install jupyterhub (for hub communication) and jupyter-vscode-proxy (for browser-based VS Code via JupyterHub UI). Add default CMD for jupyterhub-singleuser which KubeSpawner can override as needed. --- dockerfile | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 dockerfile diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..0758a6e --- /dev/null +++ b/dockerfile @@ -0,0 +1,35 @@ +FROM python:3.10-slim AS stage1 + +FROM mambaorg/micromamba:1.5.5 AS stage2 + +FROM debian:stable-slim AS final + +RUN apt-get update && apt-get install -y ca-certificates + +COPY --from=stage1 /usr/local /usr/local +COPY --from=stage2 /bin/micromamba /usr/local/bin/micromamba + +ENV PATH="/usr/local/bin:/opt/conda/bin:$PATH" + +# Ensure /opt/conda exists for micromamba to use +RUN mkdir -p /opt/conda + +WORKDIR /home/dev + +COPY env.yaml . + +# Use micromamba to create the environment and install packages +RUN /usr/local/bin/micromamba create -f env.yaml -n mdx2-dev && \ + /usr/local/bin/micromamba install -y -n mdx2-dev nexpy jupyterlab jupyterlab-h5web dials xia2 wget tar -c conda-forge && \ + /usr/local/bin/micromamba clean --all --yes + +COPY . . + +# Install the local package in editable mode within the environment +RUN /usr/local/bin/micromamba run -n mdx2-dev pip install -e . +RUN /usr/local/bin/micromamba run -n mdx2-dev pip install --no-cache-dir jupyterhub jupyter-vscode-proxy + +EXPOSE 8888 + +CMD ["/usr/local/bin/micromamba", "run", "-n", "mdx2-dev", "jupyterhub-singleuser"] + From 76f7d9b0925ad19865d3645951a11cf032ff0490 Mon Sep 17 00:00:00 2001 From: Mahmoud Saada Date: Thu, 26 Feb 2026 00:07:05 -0500 Subject: [PATCH 2/7] Add conda env bin to PATH so jupyterhub-singleuser is directly executable --- dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfile b/dockerfile index 0758a6e..4731e74 100644 --- a/dockerfile +++ b/dockerfile @@ -9,7 +9,7 @@ RUN apt-get update && apt-get install -y ca-certificates COPY --from=stage1 /usr/local /usr/local COPY --from=stage2 /bin/micromamba /usr/local/bin/micromamba -ENV PATH="/usr/local/bin:/opt/conda/bin:$PATH" +ENV PATH="/opt/conda/envs/mdx2-dev/bin:/usr/local/bin:/opt/conda/bin:$PATH" # Ensure /opt/conda exists for micromamba to use RUN mkdir -p /opt/conda From 1e67aed2071b0250277b5a5dffad9003bcc1c8e8 Mon Sep 17 00:00:00 2001 From: Mahmoud Saada Date: Thu, 26 Feb 2026 00:17:16 -0500 Subject: [PATCH 3/7] Fix PATH to use correct micromamba env location --- dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfile b/dockerfile index 4731e74..d305907 100644 --- a/dockerfile +++ b/dockerfile @@ -9,7 +9,7 @@ RUN apt-get update && apt-get install -y ca-certificates COPY --from=stage1 /usr/local /usr/local COPY --from=stage2 /bin/micromamba /usr/local/bin/micromamba -ENV PATH="/opt/conda/envs/mdx2-dev/bin:/usr/local/bin:/opt/conda/bin:$PATH" +ENV PATH="/root/micromamba/envs/mdx2-dev/bin:/usr/local/bin:/opt/conda/bin:$PATH" # Ensure /opt/conda exists for micromamba to use RUN mkdir -p /opt/conda From 2ed947babdfd38e5dd131fdaaf2487c6be4a7282 Mon Sep 17 00:00:00 2001 From: Mahmoud Saada Date: Thu, 26 Feb 2026 00:18:22 -0500 Subject: [PATCH 4/7] Add GHA Docker layer caching and remove unused QEMU setup --- .github/workflows/docker.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 9d9bcd8..9b28814 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - jlee-docker pull_request: jobs: @@ -19,9 +20,6 @@ jobs: username: ${{ vars.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -41,3 +39,5 @@ jobs: file: .github/Dockerfile push: ${{ github.ref == 'refs/heads/main' }} tags: ${{ steps.tags.outputs.tags }} + cache-from: type=gha + cache-to: type=gha,mode=max From 5aa4ad930425e5a8fea392283469daa88c7848e5 Mon Sep 17 00:00:00 2001 From: Mahmoud Saada Date: Thu, 26 Feb 2026 00:27:28 -0500 Subject: [PATCH 5/7] Set CONDA_PREFIX env vars and remove duplicate PR trigger --- .github/workflows/docker.yml | 1 - dockerfile | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 9b28814..0012e0a 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -5,7 +5,6 @@ on: branches: - main - jlee-docker - pull_request: jobs: docker: diff --git a/dockerfile b/dockerfile index d305907..55f6132 100644 --- a/dockerfile +++ b/dockerfile @@ -9,7 +9,9 @@ RUN apt-get update && apt-get install -y ca-certificates COPY --from=stage1 /usr/local /usr/local COPY --from=stage2 /bin/micromamba /usr/local/bin/micromamba -ENV PATH="/root/micromamba/envs/mdx2-dev/bin:/usr/local/bin:/opt/conda/bin:$PATH" +ENV MAMBA_ROOT_PREFIX="/root/micromamba" \ + CONDA_PREFIX="/root/micromamba/envs/mdx2-dev" \ + PATH="/root/micromamba/envs/mdx2-dev/bin:/usr/local/bin:/opt/conda/bin:$PATH" # Ensure /opt/conda exists for micromamba to use RUN mkdir -p /opt/conda From ef01aa5add394ddd2d59a2779b7e692465863a31 Mon Sep 17 00:00:00 2001 From: Mahmoud Saada Date: Thu, 26 Feb 2026 00:39:27 -0500 Subject: [PATCH 6/7] Add BuildKit mount caches for conda and pip --- dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dockerfile b/dockerfile index 55f6132..5d8c460 100644 --- a/dockerfile +++ b/dockerfile @@ -21,15 +21,15 @@ WORKDIR /home/dev COPY env.yaml . # Use micromamba to create the environment and install packages -RUN /usr/local/bin/micromamba create -f env.yaml -n mdx2-dev && \ - /usr/local/bin/micromamba install -y -n mdx2-dev nexpy jupyterlab jupyterlab-h5web dials xia2 wget tar -c conda-forge && \ - /usr/local/bin/micromamba clean --all --yes +RUN --mount=type=cache,target=/root/micromamba/pkgs \ + /usr/local/bin/micromamba create -f env.yaml -n mdx2-dev && \ + /usr/local/bin/micromamba install -y -n mdx2-dev nexpy jupyterlab jupyterlab-h5web dials xia2 wget tar -c conda-forge COPY . . -# Install the local package in editable mode within the environment -RUN /usr/local/bin/micromamba run -n mdx2-dev pip install -e . -RUN /usr/local/bin/micromamba run -n mdx2-dev pip install --no-cache-dir jupyterhub jupyter-vscode-proxy +RUN --mount=type=cache,target=/root/.cache/pip \ + /usr/local/bin/micromamba run -n mdx2-dev pip install -e . && \ + /usr/local/bin/micromamba run -n mdx2-dev pip install jupyterhub jupyter-vscode-proxy EXPOSE 8888 From 1c8b32df03ee60202a5cb4e0930695c86c35c0f2 Mon Sep 17 00:00:00 2001 From: Mahmoud Saada Date: Tue, 17 Mar 2026 00:46:57 +0200 Subject: [PATCH 7/7] Fix docker workflow: add PR trigger, correct dockerfile path, remove branch trigger --- .github/workflows/docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 0012e0a..2b86bf8 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,7 +4,7 @@ on: push: branches: - main - - jlee-docker + pull_request: jobs: docker: @@ -35,7 +35,7 @@ jobs: uses: docker/build-push-action@v6 with: context: . - file: .github/Dockerfile + file: dockerfile push: ${{ github.ref == 'refs/heads/main' }} tags: ${{ steps.tags.outputs.tags }} cache-from: type=gha