@@ -6,12 +6,12 @@ ARG CUDA_IMAGE_FLAVOR
6
6
7
7
ARG NB_USER=jovyan
8
8
ARG NB_UID=1000
9
- ARG JUPYTERHUB_VERSION=4.0.2
10
- ARG JUPYTERLAB_VERSION=4.1.0
9
+ ARG JUPYTERHUB_VERSION=4.1.4
10
+ ARG JUPYTERLAB_VERSION=4.1.5
11
11
ARG CODE_BUILTIN_EXTENSIONS_DIR=/opt/code-server/lib/vscode/extensions
12
- ARG CODE_SERVER_VERSION=4.21.0
13
- ARG GIT_VERSION=2.43 .0
14
- ARG GIT_LFS_VERSION=3.4 .1
12
+ ARG CODE_SERVER_VERSION=4.22.1
13
+ ARG GIT_VERSION=2.44 .0
14
+ ARG GIT_LFS_VERSION=3.5 .1
15
15
ARG PANDOC_VERSION=3.1.11
16
16
17
17
FROM ${BUILD_ON_IMAGE}${PYTHON_VERSION:+:}${PYTHON_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} AS files
@@ -29,8 +29,24 @@ COPY conf/shell /files
29
29
COPY conf/user /files
30
30
COPY scripts /files
31
31
32
+ # # Copy content of skel directory to backup
32
33
RUN cp -a /files/etc/skel/. /files/var/backups/skel \
33
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 \
34
50
# # Ensure file modes are correct when using CI
35
51
# # Otherwise set to 777 in the target image
36
52
&& find /files -type d -exec chmod 755 {} \; \
@@ -43,11 +59,6 @@ FROM glcr.b-data.ch/git-lfs/glfsi:${GIT_LFS_VERSION} AS glfsi
43
59
44
60
FROM ${BUILD_ON_IMAGE}${PYTHON_VERSION:+:}${PYTHON_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR}
45
61
46
- LABEL org.opencontainers.image.licenses="MIT" \
47
- org.opencontainers.image.source="https://gitlab.b-data.ch/jupyterlab/python/docker-stack" \
48
- org.opencontainers.image.vendor="b-data GmbH" \
49
- org.opencontainers.image.authors="Olivier Benz <olivier.benz@b-data.ch>"
50
-
51
62
ARG DEBIAN_FRONTEND=noninteractive
52
63
53
64
ARG BUILD_ON_IMAGE
@@ -65,6 +76,17 @@ ARG BUILD_START
65
76
66
77
ARG CODE_WORKDIR
67
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
+
68
90
ENV PARENT_IMAGE=${BUILD_ON_IMAGE}${PYTHON_VERSION:+:}${PYTHON_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} \
69
91
NB_USER=${NB_USER} \
70
92
NB_UID=${NB_UID} \
@@ -151,10 +173,10 @@ RUN dpkgArch="$(dpkg --print-architecture)" \
151
173
fi \
152
174
# # Install font MesloLGS NF
153
175
&& mkdir -p /usr/share/fonts/truetype/meslo \
154
- && curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf -o /usr/share/fonts/truetype/meslo/MesloLGS\ NF\ Regular.ttf \
155
- && curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf -o /usr/share/fonts/truetype/meslo/MesloLGS\ NF\ Bold.ttf \
156
- && curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf -o /usr/share/fonts/truetype/meslo/MesloLGS\ NF\ Italic.ttf \
157
- && 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 \
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" \
158
180
&& fc-cache -fsv \
159
181
# # Git: Set default branch name to main
160
182
&& git config --system init.defaultBranch main \
@@ -177,6 +199,11 @@ RUN dpkgArch="$(dpkg --print-architecture)" \
177
199
fi \
178
200
# # Add user
179
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
180
207
&& mkdir -p /var/backups/skel \
181
208
&& chown ${NB_UID}:${NB_GID} /var/backups/skel \
182
209
# # Install Tini
@@ -195,20 +222,22 @@ RUN mkdir /opt/code-server \
195
222
&& cd /opt/code-server \
196
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 \
197
224
&& curl -sL https://upload.wikimedia.org/wikipedia/commons/9/9a/Visual_Studio_Code_1.35_icon.svg -o vscode.svg \
225
+ # # Copy custom fonts
226
+ && mkdir -p /opt/code-server/src/browser/media/fonts \
227
+ && cp -a /usr/share/fonts/truetype/meslo/*.ttf /opt/code-server/src/browser/media/fonts \
198
228
# # Include custom fonts
199
- && 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 \
200
- && 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 \
201
- && 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 \
202
- && 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 \
229
+ && 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 \
230
+ && 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 \
231
+ && 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 \
232
+ && 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 \
203
233
&& 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 \
204
234
# # Install code-server extensions
205
235
&& cd /tmp \
206
- && curl -sLO https://dl.b-data.ch/vsix/alefragnani.project-manager-12.7.0.vsix \
207
- && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension alefragnani.project-manager-12.7.0.vsix \
208
236
&& curl -sLO https://dl.b-data.ch/vsix/piotrpalarz.vscode-gitignore-generator-1.0.3.vsix \
209
237
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension piotrpalarz.vscode-gitignore-generator-1.0.3.vsix \
210
238
&& curl -sLO https://dl.b-data.ch/vsix/mutantdino.resourcemonitor-1.0.7.vsix \
211
239
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mutantdino.resourcemonitor-1.0.7.vsix \
240
+ && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension alefragnani.project-manager \
212
241
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension GitHub.vscode-pull-request-github \
213
242
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension GitLab.gitlab-workflow \
214
243
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-python.python \
@@ -241,11 +270,22 @@ RUN export PIP_BREAK_SYSTEM_PACKAGES=1 \
241
270
nbclassic \
242
271
nbconvert \
243
272
python-lsp-server[all] \
273
+ # # Jupyter Server Proxy: Set maximum allowed HTTP body size to 10 GiB
274
+ && sed -i 's/AsyncHTTPClient(/AsyncHTTPClient(max_body_size=10737418240, /g' \
275
+ /usr/local/lib/python*/*-packages/jupyter_server_proxy/handlers.py \
276
+ # # Jupyter Server Proxy: Set maximum allowed websocket message size to 1 GiB
277
+ && sed -i 's/"_default_max_message_size",.*$/"_default_max_message_size", 1024 \* 1024 \* 1024/g' \
278
+ /usr/local/lib/python*/*-packages/jupyter_server_proxy/websocket.py \
279
+ && sed -i 's/_default_max_message_size =.*$/_default_max_message_size = 1024 \* 1024 \* 1024/g' \
280
+ /usr/local/lib/python*/*-packages/tornado/websocket.py \
281
+ # # Copy custom fonts
282
+ && mkdir -p /usr/local/share/jupyter/lab/static/assets/fonts \
283
+ && cp -a /usr/share/fonts/truetype/meslo/*.ttf /usr/local/share/jupyter/lab/static/assets/fonts \
244
284
# # Include custom fonts
245
- && 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 \
246
- && 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 \
247
- && 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 \
248
- && 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 \
285
+ && 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 \
286
+ && 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 \
287
+ && 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 \
288
+ && 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 \
249
289
&& 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 \
250
290
# # Clean up
251
291
&& rm -rf /tmp/* \
@@ -274,6 +314,8 @@ RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master
274
314
&& echo "[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh" >> ${HOME}/.zshrc \
275
315
# # Create user's private bin
276
316
&& mkdir -p ${HOME}/.local/bin \
317
+ # # Record population timestamp
318
+ && date -uIseconds > ${HOME}/.populated \
277
319
# # Create backup of home directory
278
320
&& cp -a ${HOME}/. /var/backups/skel
279
321
0 commit comments