Skip to content

Commit 7a34c72

Browse files
committed
Freeze Python v3.12.3
1 parent 0e32150 commit 7a34c72

File tree

4 files changed

+569
-1
lines changed

4 files changed

+569
-1
lines changed

VERSION_MATRIX.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Topmost entry = Tag `latest`
44

55
| Python | Jupyter Hub | Jupyter Lab | code‑server (Code) | Git | Git LFS | Pandoc | CTAN date[^2] | Quarto[^2] | Linux distro |
66
|:-----------|:------------|:------------|:-------------------|:-------|:--------|:-------|:--------------|:------------|:-------------|
7-
| 3.12.3 | 5.0.0 | 4.2.1 | 4.89.1 (1.89.1) | 2.45.2 | 3.5.1 | 3.1.11 | | 1.4.555 | Debian 12 |
7+
| 3.12.3 | 5.0.0 | 4.2.1 | 4.89.1 (1.89.1) | 2.45.2 | 3.5.1 | 3.1.11 | 2024‑06‑06 | 1.4.555 | Debian 12 |
88
| 3.11.9 | 4.1.5 | 4.1.5 | 4.22.1 (1.87.2) | 2.44.0 | 3.5.1 | 3.1.11 | | 1.4.552 | Debian 12 |
99
| 3.12.2 | 4.1.5 | 4.1.6 | 4.23.0 (1.88.0) | 2.44.0 | 3.5.1 | 3.1.11 | 2024‑04‑09 | 1.4.553 | Debian 12 |
1010
| 3.11.8 | 4.1.5 | 4.1.5 | 4.22.1 (1.87.2) | 2.44.0 | 3.5.1 | 3.1.11 | 2024‑04‑02 | 1.4.552 | Debian 12 |

base/3.12.3.Dockerfile

Lines changed: 330 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,330 @@
1+
ARG BASE_IMAGE=debian
2+
ARG BASE_IMAGE_TAG=12
3+
ARG BUILD_ON_IMAGE=glcr.b-data.ch/python/ver
4+
ARG PYTHON_VERSION=3.12.3
5+
ARG CUDA_IMAGE_FLAVOR
6+
7+
ARG NB_USER=jovyan
8+
ARG NB_UID=1000
9+
ARG JUPYTERHUB_VERSION=5.0.0
10+
ARG JUPYTERLAB_VERSION=4.2.1
11+
ARG CODE_BUILTIN_EXTENSIONS_DIR=/opt/code-server/lib/vscode/extensions
12+
ARG CODE_SERVER_VERSION=4.89.1
13+
ARG GIT_VERSION=2.45.2
14+
ARG GIT_LFS_VERSION=3.5.1
15+
ARG PANDOC_VERSION=3.1.11
16+
17+
FROM ${BUILD_ON_IMAGE}${PYTHON_VERSION:+:}${PYTHON_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} AS files
18+
19+
ARG NB_UID
20+
ENV NB_GID=100
21+
22+
RUN mkdir /files
23+
24+
COPY assets /files
25+
COPY conf/ipython /files
26+
COPY conf/jupyter /files
27+
COPY conf/jupyterlab /files
28+
COPY conf/shell /files
29+
COPY conf/user /files
30+
COPY scripts /files
31+
32+
## Copy content of skel directory to backup
33+
RUN cp -a /files/etc/skel/. /files/var/backups/skel \
34+
&& chown -R ${NB_UID}:${NB_GID} /files/var/backups/skel \
35+
## Copy custom fonts
36+
&& mkdir -p /files/usr/local/share/jupyter/lab/static/assets \
37+
&& cp -a /files/opt/code-server/src/browser/media/css \
38+
/files/usr/local/share/jupyter/lab/static/assets \
39+
&& cp -a /files/opt/code-server/src/browser/media/fonts \
40+
/files/usr/local/share/jupyter/lab/static/assets \
41+
&& if [ -n "${CUDA_VERSION}" ]; then \
42+
## Use entrypoint of CUDA image
43+
mv /opt/nvidia/entrypoint.d /opt/nvidia/nvidia_entrypoint.sh \
44+
/files/usr/local/bin; \
45+
mv /files/usr/local/bin/start.sh \
46+
/files/usr/local/bin/entrypoint.d/99-start.sh; \
47+
mv /files/usr/local/bin/nvidia_entrypoint.sh \
48+
/files/usr/local/bin/start.sh; \
49+
fi \
50+
## Ensure file modes are correct when using CI
51+
## Otherwise set to 777 in the target image
52+
&& find /files -type d -exec chmod 755 {} \; \
53+
&& find /files -type f -exec chmod 644 {} \; \
54+
&& find /files/usr/local/bin -type f -exec chmod 755 {} \; \
55+
&& find /files/etc/profile.d -type f -exec chmod 755 {} \;
56+
57+
FROM glcr.b-data.ch/git/gsi/${GIT_VERSION}/${BASE_IMAGE}:${BASE_IMAGE_TAG} AS gsi
58+
FROM glcr.b-data.ch/git-lfs/glfsi:${GIT_LFS_VERSION} AS glfsi
59+
60+
FROM ${BUILD_ON_IMAGE}${PYTHON_VERSION:+:}${PYTHON_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR}
61+
62+
ARG DEBIAN_FRONTEND=noninteractive
63+
64+
ARG BUILD_ON_IMAGE
65+
ARG CUDA_IMAGE_FLAVOR
66+
ARG NB_USER
67+
ARG NB_UID
68+
ARG JUPYTERHUB_VERSION
69+
ARG JUPYTERLAB_VERSION
70+
ARG CODE_BUILTIN_EXTENSIONS_DIR
71+
ARG CODE_SERVER_VERSION
72+
ARG GIT_VERSION
73+
ARG GIT_LFS_VERSION
74+
ARG PANDOC_VERSION
75+
ARG BUILD_START
76+
77+
ARG CODE_WORKDIR
78+
79+
ARG CUDA_IMAGE_LICENSE=${CUDA_VERSION:+"NVIDIA Deep Learning Container License"}
80+
ARG IMAGE_LICENSE=${CUDA_IMAGE_LICENSE:-"MIT"}
81+
ARG IMAGE_SOURCE=https://gitlab.b-data.ch/jupyterlab/python/docker-stack
82+
ARG IMAGE_VENDOR="b-data GmbH"
83+
ARG IMAGE_AUTHORS="Olivier Benz <olivier.benz@b-data.ch>"
84+
85+
LABEL org.opencontainers.image.licenses="$IMAGE_LICENSE" \
86+
org.opencontainers.image.source="$IMAGE_SOURCE" \
87+
org.opencontainers.image.vendor="$IMAGE_VENDOR" \
88+
org.opencontainers.image.authors="$IMAGE_AUTHORS"
89+
90+
ENV PARENT_IMAGE=${BUILD_ON_IMAGE}${PYTHON_VERSION:+:}${PYTHON_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} \
91+
NB_USER=${NB_USER} \
92+
NB_UID=${NB_UID} \
93+
JUPYTERHUB_VERSION=${JUPYTERHUB_VERSION} \
94+
JUPYTERLAB_VERSION=${JUPYTERLAB_VERSION} \
95+
CODE_SERVER_VERSION=${CODE_SERVER_VERSION} \
96+
GIT_VERSION=${GIT_VERSION} \
97+
GIT_LFS_VERSION=${GIT_LFS_VERSION} \
98+
PANDOC_VERSION=${PANDOC_VERSION} \
99+
BUILD_DATE=${BUILD_START}
100+
101+
ENV NB_GID=100
102+
103+
## Install Git
104+
COPY --from=gsi /usr/local /usr/local
105+
## Install Git LFS
106+
COPY --from=glfsi /usr/local /usr/local
107+
108+
USER root
109+
110+
RUN dpkgArch="$(dpkg --print-architecture)" \
111+
## Unminimise if the system has been minimised
112+
&& if [ $(command -v unminimize) ]; then \
113+
yes | unminimize; \
114+
fi \
115+
&& apt-get update \
116+
&& apt-get -y install --no-install-recommends \
117+
bash-completion \
118+
build-essential \
119+
curl \
120+
file \
121+
fontconfig \
122+
g++ \
123+
gcc \
124+
gfortran \
125+
gnupg \
126+
htop \
127+
info \
128+
jq \
129+
libclang-dev \
130+
man-db \
131+
nano \
132+
ncdu \
133+
procps \
134+
psmisc \
135+
screen \
136+
sudo \
137+
swig \
138+
tmux \
139+
vim-tiny \
140+
wget \
141+
zsh \
142+
## Git: Additional runtime dependencies
143+
libcurl3-gnutls \
144+
liberror-perl \
145+
## Git: Additional runtime recommendations
146+
less \
147+
ssh-client \
148+
## Python: Additional dev dependencies
149+
&& if [ -z "$PYTHON_VERSION" ]; then \
150+
apt-get -y install --no-install-recommends \
151+
python3-dev \
152+
## Install Python package installer
153+
## (dep: python3-distutils, python3-setuptools and python3-wheel)
154+
python3-pip \
155+
## Install venv module for python3
156+
python3-venv; \
157+
## make some useful symlinks that are expected to exist
158+
## ("/usr/bin/python" and friends)
159+
for src in pydoc3 python3 python3-config; do \
160+
dst="$(echo "$src" | tr -d 3)"; \
161+
if [ -s "/usr/bin/$src" ] && [ ! -e "/usr/bin/$dst" ]; then \
162+
ln -svT "$src" "/usr/bin/$dst"; \
163+
fi \
164+
done; \
165+
else \
166+
## Force update pip, setuptools and wheel
167+
curl -sLO https://bootstrap.pypa.io/get-pip.py; \
168+
python get-pip.py \
169+
pip \
170+
setuptools \
171+
wheel; \
172+
rm get-pip.py; \
173+
fi \
174+
## Install font MesloLGS NF
175+
&& mkdir -p /usr/share/fonts/truetype/meslo \
176+
&& curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf -o "/usr/share/fonts/truetype/meslo/MesloLGS NF Regular.ttf" \
177+
&& curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf -o "/usr/share/fonts/truetype/meslo/MesloLGS NF Bold.ttf" \
178+
&& curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf -o "/usr/share/fonts/truetype/meslo/MesloLGS NF Italic.ttf" \
179+
&& curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf -o "/usr/share/fonts/truetype/meslo/MesloLGS NF Bold Italic.ttf" \
180+
&& fc-cache -fsv \
181+
## Git: Set default branch name to main
182+
&& git config --system init.defaultBranch main \
183+
## Git: Store passwords for one hour in memory
184+
&& git config --system credential.helper "cache --timeout=3600" \
185+
## Git: Merge the default branch from the default remote when "git pull" is run
186+
&& git config --system pull.rebase false \
187+
## Install pandoc
188+
&& curl -sLO https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
189+
&& dpkg -i pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
190+
&& rm pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
191+
## Delete potential user with UID 1000
192+
&& if $(grep -q 1000 /etc/passwd); then \
193+
userdel $(id -un 1000); \
194+
fi \
195+
## Do not set user limits for sudo/sudo-i
196+
&& sed -i 's/.*pam_limits.so/#&/g' /etc/pam.d/sudo \
197+
&& if [ -f "/etc/pam.d/sudo-i" ]; then \
198+
sed -i 's/.*pam_limits.so/#&/g' /etc/pam.d/sudo-i; \
199+
fi \
200+
## Add user
201+
&& useradd -l -m -s $(which zsh) -N -u ${NB_UID} ${NB_USER} \
202+
## Mark home directory as populated
203+
&& touch /home/${NB_USER}/.populated \
204+
&& chown ${NB_UID}:${NB_GID} /home/${NB_USER}/.populated \
205+
&& chmod go+w /home/${NB_USER}/.populated \
206+
## Create backup directory for home directory
207+
&& mkdir -p /var/backups/skel \
208+
&& chown ${NB_UID}:${NB_GID} /var/backups/skel \
209+
## Install Tini
210+
&& curl -sL https://github.com/krallin/tini/releases/download/v0.19.0/tini-${dpkgArch} -o /usr/local/bin/tini \
211+
&& chmod +x /usr/local/bin/tini \
212+
## Clean up
213+
&& rm -rf /tmp/* \
214+
&& rm -rf /var/lib/apt/lists/* \
215+
${HOME}/.cache
216+
217+
ENV PATH=/opt/code-server/bin:$PATH \
218+
CS_DISABLE_GETTING_STARTED_OVERRIDE=1
219+
220+
## Install code-server
221+
RUN mkdir /opt/code-server \
222+
&& cd /opt/code-server \
223+
&& curl -sL https://github.com/coder/code-server/releases/download/v${CODE_SERVER_VERSION}/code-server-${CODE_SERVER_VERSION}-linux-$(dpkg --print-architecture).tar.gz | tar zxf - --no-same-owner --strip-components=1 \
224+
## Copy custom fonts
225+
&& mkdir -p /opt/code-server/src/browser/media/fonts \
226+
&& cp -a /usr/share/fonts/truetype/meslo/*.ttf /opt/code-server/src/browser/media/fonts \
227+
## Include custom fonts
228+
&& sed -i 's|</head>| <link rel="preload" href="{{BASE}}/_static/src/browser/media/fonts/MesloLGS NF Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">\n </head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
229+
&& sed -i 's|</head>| <link rel="preload" href="{{BASE}}/_static/src/browser/media/fonts/MesloLGS NF Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">\n </head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
230+
&& sed -i 's|</head>| <link rel="preload" href="{{BASE}}/_static/src/browser/media/fonts/MesloLGS NF Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">\n </head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
231+
&& sed -i 's|</head>| <link rel="preload" href="{{BASE}}/_static/src/browser/media/fonts/MesloLGS NF Bold Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">\n </head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
232+
&& sed -i 's|</head>| <link rel="stylesheet" type="text/css" href="{{BASE}}/_static/src/browser/media/css/fonts.css">\n </head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
233+
## Install code-server extensions
234+
&& cd /tmp \
235+
&& curl -sLO https://dl.b-data.ch/vsix/piotrpalarz.vscode-gitignore-generator-1.0.3.vsix \
236+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension piotrpalarz.vscode-gitignore-generator-1.0.3.vsix \
237+
&& curl -sLO https://dl.b-data.ch/vsix/mutantdino.resourcemonitor-1.0.7.vsix \
238+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mutantdino.resourcemonitor-1.0.7.vsix \
239+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension alefragnani.project-manager \
240+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension GitHub.vscode-pull-request-github \
241+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension GitLab.gitlab-workflow \
242+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-python.python \
243+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-toolsai.jupyter \
244+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension christian-kohler.path-intellisense \
245+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension eamodio.gitlens@11.7.0 \
246+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mhutchie.git-graph \
247+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension redhat.vscode-yaml \
248+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension grapecity.gc-excelviewer \
249+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension editorconfig.editorconfig \
250+
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension DavidAnson.vscode-markdownlint \
251+
## Create folders temp and tmp for Jupyter extension
252+
&& cd /opt/code-server/lib/vscode/extensions/ms-toolsai.jupyter-* \
253+
&& mkdir -m 1777 temp \
254+
&& mkdir -m 1777 tmp \
255+
## Clean up
256+
&& rm -rf /tmp/* \
257+
${HOME}/.config \
258+
${HOME}/.local
259+
260+
## Install JupyterLab
261+
RUN export PIP_BREAK_SYSTEM_PACKAGES=1 \
262+
&& pip install \
263+
jupyter-server-proxy \
264+
jupyterhub==${JUPYTERHUB_VERSION} \
265+
jupyterlab==${JUPYTERLAB_VERSION} \
266+
jupyterlab-git \
267+
jupyterlab-lsp \
268+
notebook \
269+
nbclassic \
270+
nbconvert \
271+
python-lsp-server[all] \
272+
## Jupyter Server Proxy: Set maximum allowed HTTP body size to 10 GiB
273+
&& sed -i 's/AsyncHTTPClient(/AsyncHTTPClient(max_body_size=10737418240, /g' \
274+
/usr/local/lib/python*/*-packages/jupyter_server_proxy/handlers.py \
275+
## Jupyter Server Proxy: Set maximum allowed websocket message size to 1 GiB
276+
&& sed -i 's/"_default_max_message_size",.*$/"_default_max_message_size", 1024 \* 1024 \* 1024/g' \
277+
/usr/local/lib/python*/*-packages/jupyter_server_proxy/websocket.py \
278+
&& sed -i 's/_default_max_message_size =.*$/_default_max_message_size = 1024 \* 1024 \* 1024/g' \
279+
/usr/local/lib/python*/*-packages/tornado/websocket.py \
280+
## Copy custom fonts
281+
&& mkdir -p /usr/local/share/jupyter/lab/static/assets/fonts \
282+
&& cp -a /usr/share/fonts/truetype/meslo/*.ttf /usr/local/share/jupyter/lab/static/assets/fonts \
283+
## Include custom fonts
284+
&& sed -i 's|</head>|<link rel="preload" href="{{page_config.fullStaticUrl}}/assets/fonts/MesloLGS NF Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
285+
&& sed -i 's|</head>|<link rel="preload" href="{{page_config.fullStaticUrl}}/assets/fonts/MesloLGS NF Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
286+
&& sed -i 's|</head>|<link rel="preload" href="{{page_config.fullStaticUrl}}/assets/fonts/MesloLGS NF Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
287+
&& sed -i 's|</head>|<link rel="preload" href="{{page_config.fullStaticUrl}}/assets/fonts/MesloLGS NF Bold Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
288+
&& sed -i 's|</head>|<link rel="stylesheet" type="text/css" href="{{page_config.fullStaticUrl}}/assets/css/fonts.css"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
289+
## Clean up
290+
&& rm -rf /tmp/* \
291+
${HOME}/.cache
292+
293+
## Switch back to ${NB_USER} to avoid accidental container runs as root
294+
USER ${NB_USER}
295+
296+
ENV HOME=/home/${NB_USER} \
297+
CODE_WORKDIR=${CODE_WORKDIR:-/home/${NB_USER}/projects} \
298+
SHELL=/usr/bin/zsh \
299+
TERM=xterm-256color
300+
301+
WORKDIR ${HOME}
302+
303+
## Install Oh My Zsh with Powerlevel10k theme
304+
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended \
305+
&& git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${HOME}/.oh-my-zsh/custom/themes/powerlevel10k \
306+
&& ${HOME}/.oh-my-zsh/custom/themes/powerlevel10k/gitstatus/install -f \
307+
&& sed -i 's/ZSH="\/home\/jovyan\/.oh-my-zsh"/ZSH="$HOME\/.oh-my-zsh"/g' ${HOME}/.zshrc \
308+
&& sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="powerlevel10k\/powerlevel10k"/g' ${HOME}/.zshrc \
309+
&& echo "\n# set PATH so it includes user's private bin if it exists\nif [ -d \"\$HOME/bin\" ] && [[ \"\$PATH\" != *\"\$HOME/bin\"* ]] ; then\n PATH=\"\$HOME/bin:\$PATH\"\nfi" | tee -a ${HOME}/.bashrc ${HOME}/.zshrc \
310+
&& echo "\n# set PATH so it includes user's private bin if it exists\nif [ -d \"\$HOME/.local/bin\" ] && [[ \"\$PATH\" != *\"\$HOME/.local/bin\"* ]] ; then\n PATH=\"\$HOME/.local/bin:\$PATH\"\nfi" | tee -a ${HOME}/.bashrc ${HOME}/.zshrc \
311+
&& echo "\n# Update last-activity timestamps while in screen/tmux session\nif [ ! -z \"\$TMUX\" -o ! -z \"\$STY\" ] ; then\n busy &\nfi" >> ${HOME}/.bashrc \
312+
&& echo "\n# Update last-activity timestamps while in screen/tmux session\nif [ ! -z \"\$TMUX\" -o ! -z \"\$STY\" ] ; then\n setopt nocheckjobs\n busy &\nfi" >> ${HOME}/.zshrc \
313+
&& echo "\n# To customize prompt, run \`p10k configure\` or edit ~/.p10k.zsh." >> ${HOME}/.zshrc \
314+
&& echo "[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh" >> ${HOME}/.zshrc \
315+
## Create user's private bin
316+
&& mkdir -p ${HOME}/.local/bin \
317+
## Record population timestamp
318+
&& date -uIseconds > ${HOME}/.populated \
319+
## Create backup of home directory
320+
&& cp -a ${HOME}/. /var/backups/skel
321+
322+
## Copy files as late as possible to avoid cache busting
323+
COPY --from=files /files /
324+
COPY --from=files /files/var/backups/skel ${HOME}
325+
326+
EXPOSE 8888
327+
328+
## Configure container startup
329+
ENTRYPOINT ["tini", "-g", "--", "start.sh"]
330+
CMD ["start-notebook.sh"]

0 commit comments

Comments
 (0)