diff --git a/venv/Dockerfile b/venv/Dockerfile
index ea84c1630b18869c8c6905ba8c0fdefbc37754d6..2ceb1a05fff034478c134d13ae9ee8c664d68084 100644
--- a/venv/Dockerfile
+++ b/venv/Dockerfile
@@ -1,4 +1,27 @@
-FROM jupyter/base-notebook:hub-2.1.1
-USER root
+FROM ubuntu:focal-20220316
+
 ENV DEBIAN_FRONTEND noninteractive
-RUN apt update && apt remove -y curl libcurl4 librtmp1 && apt autoremove -y && apt install -y curl
+
+ENV USERNAME=jovyan
+
+# create the app user
+RUN adduser --uid 1000 --ingroup users --gecos "" --disabled-password ${USERNAME}
+
+RUN apt update && \
+    apt -y upgrade && \
+    apt clean && \
+    rm -rf /var/lib/apt/lists/*
+
+COPY requirements_apt.txt /tmp/requirements_apt.txt
+COPY requirements_pip.txt /tmp/requirements_pip.txt
+
+RUN apt update && \
+    cat /tmp/requirements_apt.txt | xargs apt install -yq && \
+    apt clean && \
+    rm -rf /var/lib/apt/lists/* && \
+    pip install -r /tmp/requirements_pip.txt && \
+    chown -R ${USERNAME}:users ${HOME} && \
+    rm /tmp/requirements_pip.txt && \
+    rm /tmp/requirements_apt.txt
+
+USER jovyan
diff --git a/venv/requirements_apt.txt b/venv/requirements_apt.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cf9dd0c7d3f8be1c24c9c72eefe66d38a64d5d05
--- /dev/null
+++ b/venv/requirements_apt.txt
@@ -0,0 +1,12 @@
+bash
+ca-certificates
+curl
+python3
+python3-pip
+libc6
+libstdc++6
+rsync
+tar
+uuid-runtime
+vim
+wget
diff --git a/venv/requirements_pip.txt b/venv/requirements_pip.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e59ce0d91fc69145721f76bd38c27394164b1689
--- /dev/null
+++ b/venv/requirements_pip.txt
@@ -0,0 +1,3 @@
+jupyterhub==2.1.1
+
+jupyterlab