Skip to content
Snippets Groups Projects
Verified Commit 7709bd30 authored by Olivier Benz's avatar Olivier Benz
Browse files

Freeze R v4.3.1

parent 87e8bc8e
No related branches found
No related tags found
No related merge requests found
......@@ -4,7 +4,7 @@ Topmost entry = Tag `latest`
| R | Python | Jupyter Hub | Jupyter Lab | code‑server (Code) | Git | Git LFS | Pandoc | CRAN[^1]/CTAN[^2] date | Quarto[^2] | QGIS[^3] | SAGA[^3] | OTB[^3][^4] | Linux distro |
|:------|:--------|:------------|:------------|:-------------------|:-------|:--------|:-------|:-----------------------|:------------|:---------|:---------|:------------|:-------------|
| 4.3.1 | 3.11.6 | 4.0.2 | 3.6.6 | 4.17.1 (1.82.2) | 2.42.0 | 3.4.0 | 3.1.1 | | 1.3.450 | 3.32.3 | 9.1.3 | 8.1.2 | Debian 12 |
| 4.3.1 | 3.11.6 | 4.0.2 | 3.6.6 | 4.18.0 (1.83.1) | 2.42.0 | 3.4.0 | 3.1.1 | 2023‑10‑30 | 1.3.450 | 3.34.0 | 9.1.3 | 8.1.2 | Debian 12 |
| 4.3.0 | 3.11.4 | 4.0.1 | 3.6.4 | 4.13.0 (1.78.2) | 2.41.0 | 3.3.0 | 3.1.1 | 2023‑06‑16 | 1.3.361 | 3.30.3 | 8.5.0 | 8.1.1 | Debian 12 |
| 4.2.3 | 3.10.11 | 4.0.0 | 3.6.3 | 4.9.1 (1.73.1) | 2.40.0 | 3.3.0 | 2.19.2 | 2023‑04‑21 | 1.2.475[^4] | n/a | 7.3.0 | n/a | Debian 11 |
| 4.2.2 | 3.10.10 | 3.1.1 | 3.6.1 | 4.9.1 (1.73.1) | 2.40.0 | 3.3.0 | 2.19.2 | 2023‑03‑15 | 1.2.335[^4] | n/a | 7.3.0 | n/a | Debian 11 |
......
ARG BASE_IMAGE=debian
ARG BASE_IMAGE_TAG=12
ARG BUILD_ON_IMAGE=glcr.b-data.ch/r/ver
ARG R_VERSION=4.3.1
ARG CUDA_IMAGE_FLAVOR
ARG NB_USER=jovyan
ARG NB_UID=1000
ARG JUPYTERHUB_VERSION=4.0.2
ARG JUPYTERLAB_VERSION=3.6.6
ARG CODE_BUILTIN_EXTENSIONS_DIR=/opt/code-server/lib/vscode/extensions
ARG CODE_SERVER_VERSION=4.18.0
ARG GIT_VERSION=2.42.0
ARG GIT_LFS_VERSION=3.4.0
ARG PANDOC_VERSION=3.1.1
FROM ${BUILD_ON_IMAGE}:${R_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} AS files
ARG NB_UID
ENV NB_GID=100
RUN mkdir /files
COPY assets /files
COPY conf/ipython /files
COPY conf/jupyter /files
COPY conf/jupyterlab /files
COPY conf/user /files
COPY scripts /files
RUN chown -R ${NB_UID}:${NB_GID} /files/var/backups/skel \
## Use standard R terminal for CUDA images
## radian forces usage of /usr/bin/python
&& if [ ! -z "$CUDA_IMAGE" ]; then \
sed -i 's|/usr/local/bin/radian|/usr/local/bin/R|g' \
/files/var/backups/skel/.local/share/code-server/User/settings.json; \
fi \
## Ensure file modes are correct when using CI
## Otherwise set to 777 in the target image
&& find /files -type d -exec chmod 755 {} \; \
&& find /files -type f -exec chmod 644 {} \; \
&& find /files/usr/local/bin -type f -exec chmod 755 {} \;
FROM glcr.b-data.ch/git/gsi/${GIT_VERSION}/${BASE_IMAGE}:${BASE_IMAGE_TAG} AS gsi
FROM glcr.b-data.ch/git-lfs/glfsi:${GIT_LFS_VERSION} AS glfsi
FROM ${BUILD_ON_IMAGE}:${R_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR}
LABEL org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.source="https://gitlab.b-data.ch/jupyterlab/r/docker-stack" \
org.opencontainers.image.vendor="b-data GmbH" \
org.opencontainers.image.authors="Olivier Benz <olivier.benz@b-data.ch>"
ARG NCPUS=1
ARG DEBIAN_FRONTEND=noninteractive
ARG BUILD_ON_IMAGE
ARG CUDA_IMAGE_FLAVOR
ARG NB_USER
ARG NB_UID
ARG JUPYTERHUB_VERSION
ARG JUPYTERLAB_VERSION
ARG CODE_BUILTIN_EXTENSIONS_DIR
ARG CODE_SERVER_VERSION
ARG GIT_VERSION
ARG GIT_LFS_VERSION
ARG PANDOC_VERSION
ARG BUILD_START
ARG CODE_WORKDIR
ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} \
NB_USER=${NB_USER} \
NB_UID=${NB_UID} \
JUPYTERHUB_VERSION=${JUPYTERHUB_VERSION} \
JUPYTERLAB_VERSION=${JUPYTERLAB_VERSION} \
CODE_SERVER_VERSION=${CODE_SERVER_VERSION} \
GIT_VERSION=${GIT_VERSION} \
GIT_LFS_VERSION=${GIT_LFS_VERSION} \
PANDOC_VERSION=${PANDOC_VERSION} \
BUILD_DATE=${BUILD_START}
ENV NB_GID=100
## Installing V8 on Linux, the alternative way
## https://ropensci.org/blog/2020/11/12/installing-v8
ENV DOWNLOAD_STATIC_LIBV8=1
## Disable prompt to install miniconda
ENV RETICULATE_MINICONDA_ENABLED=0
## Install Git
COPY --from=gsi /usr/local /usr/local
## Install Git LFS
COPY --from=glfsi /usr/local /usr/local
USER root
RUN dpkgArch="$(dpkg --print-architecture)" \
## Unminimise if the system has been minimised
&& if [ $(command -v unminimize) ]; then \
yes | unminimize; \
fi \
&& apt-get update \
&& apt-get -y install --no-install-recommends \
bash-completion \
build-essential \
curl \
file \
fontconfig \
g++ \
gcc \
gfortran \
gnupg \
htop \
info \
jq \
libclang-dev \
man-db \
nano \
procps \
psmisc \
screen \
sudo \
swig \
tmux \
vim-tiny \
wget \
zsh \
## Git: Additional runtime dependencies
libcurl3-gnutls \
liberror-perl \
## Git: Additional runtime recommendations
less \
ssh-client \
## Python: Additional dev dependencies
&& if [ -z "$PYTHON_VERSION" ]; then \
apt-get -y install --no-install-recommends \
python3-dev \
## Install Python package installer
## (dep: python3-distutils, python3-setuptools and python3-wheel)
python3-pip \
## Install venv module for python3
python3-venv; \
## make some useful symlinks that are expected to exist
## ("/usr/bin/python" and friends)
for src in pydoc3 python3 python3-config; do \
dst="$(echo "$src" | tr -d 3)"; \
[ -s "/usr/bin/$src" ]; \
[ ! -e "/usr/bin/$dst" ]; \
ln -svT "$src" "/usr/bin/$dst"; \
done; \
else \
## Force update pip, setuptools and wheel
curl -sLO https://bootstrap.pypa.io/get-pip.py; \
python get-pip.py \
pip \
setuptools \
wheel; \
rm get-pip.py; \
fi \
## Install font MesloLGS NF
&& mkdir -p /usr/share/fonts/truetype/meslo \
&& curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf -o /usr/share/fonts/truetype/meslo/MesloLGS\ NF\ Regular.ttf \
&& curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf -o /usr/share/fonts/truetype/meslo/MesloLGS\ NF\ Bold.ttf \
&& curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf -o /usr/share/fonts/truetype/meslo/MesloLGS\ NF\ Italic.ttf \
&& 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 \
&& fc-cache -fsv \
## Git: Set default branch name to main
&& git config --system init.defaultBranch main \
## Git: Store passwords for one hour in memory
&& git config --system credential.helper "cache --timeout=3600" \
## Git: Merge the default branch from the default remote when "git pull" is run
&& git config --system pull.rebase false \
## Install pandoc
&& curl -sLO https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
&& dpkg -i pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
&& rm pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
## Delete potential user with UID 1000
&& if $(grep -q 1000 /etc/passwd); then \
userdel $(id -un 1000); \
fi \
## Do not set user limits for sudo/sudo-i
&& sed -i 's/.*pam_limits.so/#&/g' /etc/pam.d/sudo \
&& if [ -f "/etc/pam.d/sudo-i" ]; then \
sed -i 's/.*pam_limits.so/#&/g' /etc/pam.d/sudo-i; \
fi \
## Add user
&& useradd -l -m -s $(which zsh) -N -u ${NB_UID} ${NB_USER} \
&& mkdir -p /var/backups/skel \
&& chown ${NB_UID}:${NB_GID} /var/backups/skel \
## Install Tini
&& curl -sL https://github.com/krallin/tini/releases/download/v0.19.0/tini-${dpkgArch} -o /usr/local/bin/tini \
&& chmod +x /usr/local/bin/tini \
## Clean up
&& rm -rf /tmp/* \
&& rm -rf /var/lib/apt/lists/* \
${HOME}/.cache
ENV PATH=/opt/code-server/bin:$PATH \
CS_DISABLE_GETTING_STARTED_OVERRIDE=1
## Install code-server
RUN mkdir /opt/code-server \
&& cd /opt/code-server \
&& 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 \
&& curl -sL https://upload.wikimedia.org/wikipedia/commons/9/9a/Visual_Studio_Code_1.35_icon.svg -o vscode.svg \
## Include custom fonts
&& 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 \
&& 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 \
&& 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 \
&& 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 \
&& 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 \
## Install code-server extensions
&& cd /tmp \
&& curl -sLO https://dl.b-data.ch/vsix/alefragnani.project-manager-12.7.0.vsix \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension alefragnani.project-manager-12.7.0.vsix \
&& curl -sLO https://dl.b-data.ch/vsix/piotrpalarz.vscode-gitignore-generator-1.0.3.vsix \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension piotrpalarz.vscode-gitignore-generator-1.0.3.vsix \
&& curl -sLO https://dl.b-data.ch/vsix/mutantdino.resourcemonitor-1.0.7.vsix \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mutantdino.resourcemonitor-1.0.7.vsix \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension GitHub.vscode-pull-request-github \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension GitLab.gitlab-workflow \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-python.python \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-toolsai.jupyter \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension christian-kohler.path-intellisense \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension eamodio.gitlens@11.7.0 \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mhutchie.git-graph \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension redhat.vscode-yaml \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension grapecity.gc-excelviewer \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension editorconfig.editorconfig \
## Create folders temp and tmp for Jupyter extension
&& cd /opt/code-server/lib/vscode/extensions/ms-toolsai.jupyter-* \
&& mkdir -m 1777 temp \
&& mkdir -m 1777 tmp \
## Clean up
&& rm -rf /tmp/* \
${HOME}/.config \
${HOME}/.local
## Install JupyterLab
RUN export PIP_BREAK_SYSTEM_PACKAGES=1 \
&& pip install \
jupyter-server-proxy \
jupyterhub==${JUPYTERHUB_VERSION} \
jupyterlab==${JUPYTERLAB_VERSION} \
jupyterlab-git \
jupyterlab-lsp \
notebook \
nbconvert \
python-lsp-server[all] \
## Include custom fonts
&& 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 \
&& 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 \
&& 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 \
&& 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 \
&& 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 \
## Clean up
&& rm -rf /tmp/* \
${HOME}/.cache
## Install R related stuff
RUN apt-get update \
&& apt-get -y install --no-install-recommends \
## Current ZeroMQ library for R pbdZMQ
libzmq3-dev \
## Required for R extension
libcairo2-dev \
libcurl4-openssl-dev \
libfontconfig1-dev \
libssl-dev \
libxml2-dev \
## Install radian
&& export PIP_BREAK_SYSTEM_PACKAGES=1 \
&& pip install radian \
## Provide NVBLAS-enabled radian_
## Enabled at runtime and only if nvidia-smi and at least one GPU are present
&& if [ ! -z "$CUDA_IMAGE" ]; then \
nvblasLib="$(cd $CUDA_HOME/lib* && ls libnvblas.so* | head -n 1)"; \
cp -a $(which radian) $(which radian)_; \
echo '#!/bin/bash' > $(which radian)_; \
echo "command -v nvidia-smi >/dev/null && nvidia-smi -L | grep 'GPU[[:space:]]\?[[:digit:]]\+' >/dev/null && export LD_PRELOAD=$nvblasLib" \
>> $(which radian)_; \
echo "$(which radian) \"\${@}\"" >> $(which radian)_; \
fi \
## Install the R kernel for Jupyter, languageserver and httpgd
&& install2.r --error --deps TRUE --skipinstalled -n $NCPUS \
IRkernel \
languageserver \
httpgd \
&& Rscript -e "IRkernel::installspec(user = FALSE, displayname = paste('R', Sys.getenv('R_VERSION')))" \
## Get rid of libcairo2-dev and its dependencies (incl. python3)
&& apt-get -y purge libcairo2-dev \
&& apt-get -y autoremove \
## IRkernel: Enable 'image/svg+xml' instead of 'image/png' for plot display
## IRkernel: Enable 'application/pdf' for PDF conversion
&& echo "options(jupyter.plot_mimetypes = c('text/plain', 'image/svg+xml', 'application/pdf'))" \
>> $(R RHOME)/etc/Rprofile.site \
## IRkernel: Include user's private bin in PATH
&& echo "if (dir.exists(file.path(Sys.getenv('HOME'), 'bin')) &&" \
>> $(R RHOME)/etc/Rprofile.site \
&& echo ' !grepl(file.path(Sys.getenv('\''HOME'\''), '\''bin'\''), Sys.getenv('\''PATH'\''))) {' \
>> $(R RHOME)/etc/Rprofile.site \
&& echo " Sys.setenv(PATH = paste(file.path(Sys.getenv('HOME'), 'bin'), Sys.getenv('PATH')," \
>> $(R RHOME)/etc/Rprofile.site \
&& echo " sep = .Platform\$path.sep))}" \
>> $(R RHOME)/etc/Rprofile.site \
&& echo "if (dir.exists(file.path(Sys.getenv('HOME'), '.local', 'bin')) &&" \
>> $(R RHOME)/etc/Rprofile.site \
&& echo ' !grepl(file.path(Sys.getenv('\''HOME'\''), '\''.local'\'', '\''bin'\''), Sys.getenv('\''PATH'\''))) {' \
>> $(R RHOME)/etc/Rprofile.site \
&& echo " Sys.setenv(PATH = paste(file.path(Sys.getenv('HOME'), '.local', 'bin'), Sys.getenv('PATH')," \
>> $(R RHOME)/etc/Rprofile.site \
&& echo " sep = .Platform\$path.sep))}" \
>> $(R RHOME)/etc/Rprofile.site \
## Install code-server extension
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension REditorSupport.r \
## REditorSupport.r: Disable help panel and revert to old behaviour
&& echo "options(vsc.helpPanel = FALSE)" >> $(R RHOME)/etc/Rprofile.site \
## Strip libraries of binary packages installed from PPM
&& strip $(R RHOME)/site-library/*/libs/*.so \
## Clean up
&& rm -rf /tmp/* \
/var/lib/apt/lists/* \
${HOME}/.cache \
${HOME}/.config \
${HOME}/.ipython \
${HOME}/.local
## Switch back to ${NB_USER} to avoid accidental container runs as root
USER ${NB_USER}
ENV HOME=/home/${NB_USER} \
CODE_WORKDIR=${CODE_WORKDIR:-/home/${NB_USER}/projects} \
SHELL=/usr/bin/zsh \
TERM=xterm-256color
WORKDIR ${HOME}
## Install Oh My Zsh with Powerlevel10k theme
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended \
&& git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${HOME}/.oh-my-zsh/custom/themes/powerlevel10k \
&& sed -i 's/ZSH="\/home\/jovyan\/.oh-my-zsh"/ZSH="$HOME\/.oh-my-zsh"/g' ${HOME}/.zshrc \
&& sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="powerlevel10k\/powerlevel10k"/g' ${HOME}/.zshrc \
&& 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" >> ${HOME}/.zshrc \
&& 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" >> ${HOME}/.zshrc \
&& echo "\n# Update last-activity timestamps while in screen/tmux session\nif [ ! -z \"\$TMUX\" -o ! -z \"\$STY\" ] ; then\n busy &\nfi" >> ${HOME}/.bashrc \
&& 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 \
&& echo "\n# To customize prompt, run \`p10k configure\` or edit ~/.p10k.zsh." >> ${HOME}/.zshrc \
&& echo "[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh" >> ${HOME}/.zshrc \
## Create user's private bin
&& mkdir -p ${HOME}/.local/bin \
## Create backup of home directory
&& cp -a ${HOME}/. /var/backups/skel
## Copy files as late as possible to avoid cache busting
COPY --from=files /files /
COPY --from=files /files/var/backups/skel ${HOME}
EXPOSE 8888
## Configure container startup
ENTRYPOINT ["tini", "-g", "--"]
CMD ["start-notebook.sh"]
ARG BASE_IMAGE=debian
ARG BASE_IMAGE_TAG=12
ARG BUILD_ON_IMAGE
ARG R_VERSION=4.3.1
ARG NODE_VERSION=18.18.2
ARG CODE_BUILTIN_EXTENSIONS_DIR=/opt/code-server/lib/vscode/extensions
FROM glcr.b-data.ch/nodejs/nsi/${NODE_VERSION}/${BASE_IMAGE}:${BASE_IMAGE_TAG} AS nsi
FROM ${BUILD_ON_IMAGE}:${R_VERSION}
ARG DEBIAN_FRONTEND=noninteractive
ARG BUILD_ON_IMAGE
ARG NODE_VERSION
ARG CODE_BUILTIN_EXTENSIONS_DIR
ARG BUILD_START
ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
NODE_VERSION=${NODE_VERSION} \
BUILD_DATE=${BUILD_START}
## Install Node.js
COPY --from=nsi /usr/local /usr/local
USER root
ENV HOME=/root
WORKDIR ${HOME}
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
bats \
libkrb5-dev \
libsecret-1-dev \
libx11-dev \
libxkbfile-dev \
libxt6 \
quilt \
rsync \
&& if [ -n "$PYTHON_VERSION" ]; then \
## make some useful symlinks that are expected to exist
## ("/usr/bin/python" and friends)
for src in pydoc3 python3; do \
dst="$(echo "$src" | tr -d 3)"; \
[ -s "/usr/bin/$src" ]; \
[ ! -e "/usr/bin/$dst" ]; \
ln -svT "$src" "/usr/bin/$dst"; \
done; \
fi \
## Clean up Node.js installation
&& bash -c 'rm -f /usr/local/bin/{docker-entrypoint.sh,yarn*}' \
&& bash -c 'mv /usr/local/{CHANGELOG.md,LICENSE,README.md} \
/usr/local/share/doc/node' \
## Enable corepack (Yarn, pnpm)
&& corepack enable \
## Install nFPM
&& echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' \
| tee /etc/apt/sources.list.d/goreleaser.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends nfpm \
## Install code-server extensions
&& code-server --extensions-dir "$CODE_BUILTIN_EXTENSIONS_DIR" \
--install-extension dbaeumer.vscode-eslint \
&& code-server --extensions-dir "$CODE_BUILTIN_EXTENSIONS_DIR" \
--install-extension esbenp.prettier-vscode \
&& code-server --extensions-dir "$CODE_BUILTIN_EXTENSIONS_DIR" \
--install-extension ms-python.black-formatter \
&& code-server --extensions-dir "$CODE_BUILTIN_EXTENSIONS_DIR" \
--install-extension timonwong.shellcheck \
## Enable shellcheck system-wide
&& ln -sf "$CODE_BUILTIN_EXTENSIONS_DIR"/timonwong.shellcheck-*/binaries/*/*/shellcheck \
/usr/local/bin/shellcheck \
## Clean up
&& rm -rf /tmp/* \
&& rm -rf /var/lib/apt/lists/* \
"$HOME/.config" \
"$HOME/.local"
## Switch back to ${NB_USER} to avoid accidental container runs as root
USER ${NB_USER}
ENV HOME=/home/${NB_USER}
WORKDIR ${HOME}
ARG BUILD_ON_IMAGE=glcr.b-data.ch/jupyterlab/r/verse
ARG R_VERSION=4.3.1
FROM ${BUILD_ON_IMAGE}:${R_VERSION}
ARG NCPUS=1
ARG DEBIAN_FRONTEND=noninteractive
ARG BUILD_ON_IMAGE
ARG BUILD_START
ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
BUILD_DATE=${BUILD_START}
USER root
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libfftw3-dev \
libgdal-dev \
libgeos-dev \
libgsl0-dev \
#libgl1-mesa-dev \
#libglu1-mesa-dev \
libhdf4-alt-dev \
libhdf5-dev \
libjq-dev \
#libpq-dev \
libproj-dev \
libprotobuf-dev \
libnetcdf-dev \
#libsqlite3-dev \
#libssl-dev \
libudunits2-dev \
nco \
netcdf-bin \
postgis \
protobuf-compiler \
sqlite3 \
tk-dev \
#unixodbc-dev
&& install2.r --error --skipinstalled -n $NCPUS \
#RColorBrewer \
RNetCDF \
classInt \
deldir \
gstat \
hdf5r \
lidR \
mapdata \
mapview \
ncdf4 \
proj4 \
raster \
rlas \
sf \
sfarrow \
sp \
spacetime \
spatstat \
spatialreg \
spdep \
stars \
terra \
tidync \
tmap \
geoR \
geosphere \
## from bioconductor
&& R -e "BiocManager::install('rhdf5', update = FALSE, ask = FALSE)" \
## Strip libraries of binary packages installed from PPM
&& strip $(R RHOME)/site-library/*/libs/*.so \
## Clean up
&& rm -rf /tmp/* \
&& rm -rf /var/lib/apt/lists/*
## Switch back to ${NB_USER} to avoid accidental container runs as root
USER ${NB_USER}
......@@ -73,6 +73,7 @@ COPY --from=saga-gissi /usr /usr
COPY --from=otbsi /usr/local /usr/local
ENV GDAL_DRIVER_PATH=${OTB_VERSION:+disable} \
OTB_APPLICATION_PATH=${OTB_VERSION:+/usr/local/lib/otb/applications}
ENV OTB_APPLICATION_PATH=${OTB_APPLICATION_PATH:-/usr/lib/otb/applications}
RUN apt-get update \
&& apt-get -y install --no-install-recommends \
......@@ -151,13 +152,17 @@ RUN apt-get update \
'^libopencv-core[0-9][0-9.][0-9][a-z]?$' \
'^libopencv-ml[0-9][0-9.][0-9][a-z]?$' \
libtinyxml-dev \
$(test -z "${OTB_VERSION}" && echo "otb-*"); \
$(test -z "${OTB_VERSION}" && echo "otb-* monteverdi"); \
if [ ! -z "${OTB_VERSION}" ]; then \
if [ "$(echo ${OTB_VERSION} | cut -c 1)" -lt "8" ]; then \
apt-get -y install --no-install-recommends \
'^libopenthreads[0-9]+$' \
libossim1; \
fi \
else \
mkdir -p /usr/lib/otb; \
ln -rs /usr/lib/$(uname -m)-linux-gnu/otb/applications \
/usr/lib/otb/applications; \
fi \
fi \
## GRASS GIS: Configure dynamic linker run time bindings
......
ARG BASE_IMAGE=debian
ARG BASE_IMAGE_TAG=12
ARG BUILD_ON_IMAGE=glcr.b-data.ch/jupyterlab/r/geospatial
ARG R_VERSION=4.3.1
ARG QGIS_VERSION=3.34.0
ARG SAGA_VERSION
ARG OTB_VERSION
## OTB_VERSION=8.1.2
ARG PROC_SAGA_NG_VERSION
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS files
ARG OTB_VERSION
ARG NB_UID=1000
ENV NB_GID=100
RUN mkdir /files
COPY conf/user /files
COPY scripts /files
RUN if [ "$(uname -m)" = "x86_64" ]; then \
## QGIS: Set OTB application folder and OTB folder
qgis3Ini="/files/var/backups/skel/.local/share/QGIS/QGIS3/profiles/default/QGIS/QGIS3.ini"; \
echo "\n[Processing]" >> ${qgis3Ini}; \
if [ -z "${OTB_VERSION}" ]; then \
echo "Configuration\OTB_APP_FOLDER=/usr/lib/otb/applications" >> \
${qgis3Ini}; \
echo "Configuration\OTB_FOLDER=/usr\n" >> ${qgis3Ini}; \
else \
echo "Configuration\OTB_APP_FOLDER=/usr/local/lib/otb/applications" >> \
${qgis3Ini}; \
echo "Configuration\OTB_FOLDER=/usr/local\n" >> ${qgis3Ini}; \
fi \
fi \
&& chown -R ${NB_UID}:${NB_GID} /files/var/backups/skel \
## Ensure file modes are correct when using CI
## Otherwise set to 777 in the target image
&& find /files -type d -exec chmod 755 {} \; \
&& find /files -type f -exec chmod 644 {} \; \
&& find /files/usr/local/bin -type f -exec chmod 755 {} \;
FROM glcr.b-data.ch/qgis/qgissi/${QGIS_VERSION}/${BASE_IMAGE}:${BASE_IMAGE_TAG} AS qgissi
FROM glcr.b-data.ch/saga-gis/saga-gissi${SAGA_VERSION:+/}${SAGA_VERSION:-:none}${SAGA_VERSION:+/$BASE_IMAGE}${SAGA_VERSION:+:$BASE_IMAGE_TAG} AS saga-gissi
FROM glcr.b-data.ch/orfeotoolbox/otbsi${OTB_VERSION:+/}${OTB_VERSION:-:none}${OTB_VERSION:+/$BASE_IMAGE}${OTB_VERSION:+:$BASE_IMAGE_TAG} AS otbsi
FROM ${BUILD_ON_IMAGE}:${R_VERSION}
ARG NCPUS=1
ARG DEBIAN_FRONTEND=noninteractive
ARG BUILD_ON_IMAGE
ARG QGIS_VERSION
ARG SAGA_VERSION
ARG OTB_VERSION
ARG PROC_SAGA_NG_VERSION
ARG BUILD_START
ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
QGIS_VERSION=${QGIS_VERSION} \
SAGA_VERSION=${SAGA_VERSION} \
OTB_VERSION=${OTB_VERSION} \
BUILD_DATE=${BUILD_START}
USER root
ENV HOME=/root \
## GRASS GIS: Make sure the distro's python is used
GRASS_PYTHON=/usr/bin/python3
WORKDIR ${HOME}
## Install QGIS
COPY --from=qgissi /usr /usr
## Install SAGA GIS
COPY --from=saga-gissi /usr /usr
## Install Orfeo Toolbox
COPY --from=otbsi /usr/local /usr/local
ENV GDAL_DRIVER_PATH=${OTB_VERSION:+disable} \
OTB_APPLICATION_PATH=${OTB_VERSION:+/usr/local/lib/otb/applications}
ENV OTB_APPLICATION_PATH=${OTB_APPLICATION_PATH:-/usr/lib/otb/applications}
RUN apt-get update \
&& apt-get -y install --no-install-recommends \
## Multimedia files trancoding
ffmpeg \
## QGIS: Additional runtime dependencies
'^libexiv2-[0-9]+$' \
'^libgdal[0-9]+$' \
libgeos-c1v5 \
'^libgsl[0-9]+$' \
libjs-jquery \
libjs-leaflet \
'^libprotobuf-lite[0-9]+$' \
libqca-qt5-2-plugins \
'^libqscintilla2-qt5-[0-9]+$' \
libqt5core5a \
libqt5gui5 \
libqt5keychain1 \
libqt5multimediawidgets5 \
libqt5network5 \
libqt5quickwidgets5 \
libqt5serialport5 \
libqt5sql5 \
libqt5webkit5 \
libqt5widgets5 \
libqt5xml5 \
libqwt-qt5-6 \
'^libspatialindex[0-9]+$' \
'^libzip[0-9]+$' \
ocl-icd-libopencl1 \
qt3d-assimpsceneimport-plugin \
qt3d-defaultgeometryloader-plugin \
qt3d-gltfsceneio-plugin \
qt3d-scene2d-plugin \
qt5-image-formats-plugins \
## QGIS: Python 3 Support
gdal-bin \
libfcgi0ldbl \
libsqlite3-mod-spatialite \
python3-gdal \
python3-jinja2 \
python3-lxml \
python3-matplotlib \
python3-owslib \
python3-plotly \
python3-psycopg2 \
python3-pygments \
python3-pyproj \
python3-pyqt5 \
python3-pyqt5.qsci \
python3-pyqt5.qtmultimedia \
python3-pyqt5.qtpositioning \
python3-pyqt5.qtsql \
python3-pyqt5.qtsvg \
python3-pyqt5.qtwebkit \
python3-sip \
python3-yaml \
qttools5-dev-tools \
## QGIS: Additional runtime recommendations
grass \
## QGIS: Additional runtime suggestions
gpsbabel \
## SAGA GIS: Supplementary runtime dependencies [^1]
libdxflib3 \
libhpdf-2.3.0 \
libsvm3 \
libwxgtk3.*-dev \
$(test -z "${SAGA_VERSION}" && echo "saga") \
## Orfeo Toolbox: Supplementary runtime dependencies
&& if [ "$(uname -m)" = "x86_64" ]; then \
apt-get -y install --no-install-recommends \
'^libboost-filesystem[0-9].[0-9]+.[0-9]$' \
'^libboost-serialization[0-9].[0-9]+.[0-9]$' \
libglew2.* \
'^libinsighttoolkit4.[0-9]+$' \
libmuparser2v5 \
libmuparserx4.* \
'^libopencv-core[0-9][0-9.][0-9][a-z]?$' \
'^libopencv-ml[0-9][0-9.][0-9][a-z]?$' \
libtinyxml-dev \
$(test -z "${OTB_VERSION}" && echo "otb-* monteverdi"); \
if [ ! -z "${OTB_VERSION}" ]; then \
if [ "$(echo ${OTB_VERSION} | cut -c 1)" -lt "8" ]; then \
apt-get -y install --no-install-recommends \
'^libopenthreads[0-9]+$' \
libossim1; \
fi \
else \
mkdir -p /usr/lib/otb; \
ln -rs /usr/lib/$(uname -m)-linux-gnu/otb/applications \
/usr/lib/otb/applications; \
fi \
fi \
## GRASS GIS: Configure dynamic linker run time bindings
&& echo "$(grass --config path)/lib" | tee /etc/ld.so.conf.d/libgrass.conf \
&& ldconfig \
## SAGA GIS: Add en_GB.UTF-8 and update locale
&& sed -i "s/# $LANG/$LANG/g" /etc/locale.gen \
&& sed -i "s/# en_GB.UTF-8/en_GB.UTF-8/g" /etc/locale.gen \
&& locale-gen \
## [^1]: SAGA GIS: libvigraimpex11 is not available for jammy
&& if $(! grep -q "jammy" /etc/os-release); then \
apt-get -y install --no-install-recommends '^libvigraimpex[0-9]+$'; \
fi \
## Clean up
&& rm -rf /tmp/* \
&& rm -rf /var/lib/apt/lists/* \
${HOME}/.cache \
${HOME}/.grass*
## Install QGIS related stuff
RUN apt-get update \
## Install QGIS-Plugin-Manager
&& apt-get -y install --no-install-recommends python3-pip \
&& export PIP_BREAK_SYSTEM_PACKAGES=1 \
&& /usr/bin/pip install qgis-plugin-manager \
## QGIS: Make sure qgis_mapserver and qgis_process find the qgis module
&& cp -a $(which qgis_mapserver) $(which qgis_mapserver)_ \
&& echo '#!/bin/bash' > $(which qgis_mapserver) \
&& echo "PYTHONPATH=/usr/lib/python3/dist-packages $(which qgis_mapserver)_ \"\${@}\"" >> \
$(which qgis_mapserver) \
&& cp -a $(which qgis_process) $(which qgis_process)_ \
&& echo '#!/bin/bash' > $(which qgis_process) \
&& echo "PYTHONPATH=/usr/lib/python3/dist-packages $(which qgis_process)_ \"\${@}\"" >> \
$(which qgis_process) \
## Install qgisprocess, the R interface to QGIS
&& install2.r --error --skipinstalled -n $NCPUS qgisprocess \
## Strip libraries of binary packages installed from PPM
&& strip $(R RHOME)/site-library/*/libs/*.so \
## Clean up
&& if [ ! -z "$PYTHON_VERSION" ]; then \
apt-get -y purge python3-pip; \
apt-get -y autoremove; \
fi \
&& rm -rf /var/lib/apt/lists/* \
${HOME}/.cache \
${HOME}/.config \
${HOME}/.local
## Switch back to ${NB_USER} to avoid accidental container runs as root
USER ${NB_USER}
ENV HOME=/home/${NB_USER} \
## Qt: Support running on headless computer
QT_QPA_PLATFORM=offscreen
WORKDIR ${HOME}
## Copy files as late as possible to avoid cache busting
COPY --from=files /files /
COPY --from=files /files/var/backups/skel ${HOME}
## QGIS: Install plugin 'Processing Saga NextGen Provider'
RUN mkdir -p ${HOME}/.local/share/QGIS/QGIS3/profiles/default/python/plugins \
&& cd ${HOME}/.local/share/QGIS/QGIS3/profiles/default/python/plugins \
&& qgis-plugin-manager init \
&& qgis-plugin-manager update \
&& qgis-plugin-manager install 'Processing Saga NextGen Provider'=="${PROC_SAGA_NG_VERSION:-0.0.7}" \
&& rm -rf .cache_qgis_plugin_manager \
## QGIS: Enable plugins
&& qgis_process plugins enable processing_saga_nextgen \
&& qgis_process plugins enable grassprovider \
&& if [ "$(uname -m)" = "x86_64" ]; then \
## QGIS: Enable OTB plugin
qgis_process plugins enable otbprovider; \
fi \
## Clean up
&& rm -rf \
${HOME}/.cache \
${HOME}/.config \
${HOME}/.grass* \
## Create backup of QGIS settings
&& cp -a ${HOME}/.local/share/QGIS /var/backups/skel/.local/share
ENV PYTHONPATH=${PYTHONPATH:+$PYTHONPATH:}${OTB_VERSION:+/usr/local/lib/otb/python}
ARG BUILD_ON_IMAGE=glcr.b-data.ch/jupyterlab/r/base
ARG R_VERSION=4.3.1
FROM ${BUILD_ON_IMAGE}:${R_VERSION}
ARG NCPUS=1
ARG DEBIAN_FRONTEND=noninteractive
ARG BUILD_ON_IMAGE
ARG BUILD_START
ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
BUILD_DATE=${BUILD_START}
USER root
RUN apt-get update \
&& apt-get -y install --no-install-recommends \
cmake \
default-libmysqlclient-dev \
#libxml2-dev \
libfribidi-dev \
libgit2-dev \
libharfbuzz-dev \
libpq-dev \
libsasl2-dev \
libsqlite3-dev \
libssh2-1-dev \
libtiff-dev \
libxtst6 \
unixodbc-dev \
&& install2.r --error --skipinstalled -n $NCPUS BiocManager \
&& install2.r --error --deps TRUE --skipinstalled -n $NCPUS \
tidyverse \
dplyr \
devtools \
formatR \
## dplyr database backends
&& install2.r --error --skipinstalled -n $NCPUS \
arrow \
duckdb \
fst \
## Get rid of libharfbuzz-dev and its dependencies (incl. python3)
&& apt-get -y purge libharfbuzz-dev \
&& apt-get -y autoremove \
&& apt-get -y install --no-install-recommends libharfbuzz-icu0 \
## Strip libraries of binary packages installed from PPM
&& strip $(R RHOME)/site-library/*/libs/*.so \
## Clean up
&& rm -rf /tmp/* \
&& rm -rf /var/lib/apt/lists/*
## Switch back to ${NB_USER} to avoid accidental container runs as root
USER ${NB_USER}
ARG BUILD_ON_IMAGE=glcr.b-data.ch/jupyterlab/r/tidyverse
ARG R_VERSION=4.3.1
ARG CODE_BUILTIN_EXTENSIONS_DIR=/opt/code-server/lib/vscode/extensions
ARG QUARTO_VERSION=1.3.450
ARG CTAN_REPO=https://www.texlive.info/tlnet-archive/2023/10/31/tlnet
FROM ${BUILD_ON_IMAGE}:${R_VERSION}
ARG NCPUS=1
ARG DEBIAN_FRONTEND=noninteractive
ARG BUILD_ON_IMAGE
ARG CODE_BUILTIN_EXTENSIONS_DIR
ARG QUARTO_VERSION
ARG CTAN_REPO
ARG BUILD_START
USER root
ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
QUARTO_VERSION=${QUARTO_VERSION} \
CTAN_REPO=${CTAN_REPO} \
BUILD_DATE=${BUILD_START}
ENV HOME=/root \
PATH=/opt/TinyTeX/bin/linux:/opt/quarto/bin:$PATH
WORKDIR ${HOME}
## Add LaTeX, rticles and bookdown support
RUN dpkgArch="$(dpkg --print-architecture)" \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
default-jdk \
fonts-roboto \
ghostscript \
hugo \
lbzip2 \
libbz2-dev \
libglpk-dev \
libgmp3-dev \
libgl1-mesa-dev \
libglu1-mesa-dev \
libharfbuzz-dev \
libhunspell-dev \
libicu-dev \
liblzma-dev \
#libpcre2-dev \
libmagick++-dev \
libopenmpi-dev \
libpoppler-cpp-dev \
librdf0-dev \
## Installing libnode-dev uninstalls nodejs
## https://github.com/jeroen/V8/issues/100
#libnode-dev \
librsvg2-bin \
qpdf \
texinfo \
## Install R package redland
&& install2.r --error --skipinstalled -n $NCPUS redland \
## Explicitly install runtime library sub-deps of librdf0-dev
&& apt-get install -y \
libcurl4-openssl-dev \
libxslt-dev \
librdf0 \
redland-utils \
rasqal-utils \
raptor2-utils \
## Get rid of librdf0-dev and its dependencies (incl. libcurl4-gnutls-dev)
&& apt-get -y autoremove \
## Install quarto
&& curl -sLO https://github.com/quarto-dev/quarto-cli/releases/download/v${QUARTO_VERSION}/quarto-${QUARTO_VERSION}-linux-${dpkgArch}.tar.gz \
&& mkdir -p /opt/quarto \
&& tar -xzf quarto-${QUARTO_VERSION}-linux-${dpkgArch}.tar.gz -C /opt/quarto --no-same-owner --strip-components=1 \
&& rm quarto-${QUARTO_VERSION}-linux-${dpkgArch}.tar.gz \
## Remove quarto pandoc
&& rm /opt/quarto/bin/tools/pandoc \
## Link to system pandoc
&& ln -s /usr/bin/pandoc /opt/quarto/bin/tools/pandoc \
## Tell APT about the TeX Live installation
## by building a dummy package using equivs
&& apt-get install -y --no-install-recommends equivs \
&& cd /tmp \
&& wget https://github.com/scottkosty/install-tl-ubuntu/raw/master/debian-control-texlive-in.txt \
&& equivs-build debian-* \
&& mv texlive-local*.deb texlive-local.deb \
&& dpkg -i texlive-local.deb \
&& apt-get -y purge equivs \
&& apt-get -y autoremove \
## Admin-based install of TinyTeX:
&& wget -qO- "https://yihui.org/tinytex/install-unx.sh" \
| sh -s - --admin --no-path \
&& mv ${HOME}/.TinyTeX /opt/TinyTeX \
&& sed -i "s|${HOME}/.TinyTeX|/opt/TinyTeX|g" \
/opt/TinyTeX/texmf-var/fonts/conf/texlive-fontconfig.conf \
&& ln -rs /opt/TinyTeX/bin/$(uname -m)-linux \
/opt/TinyTeX/bin/linux \
&& /opt/TinyTeX/bin/linux/tlmgr path add \
&& tlmgr update --self \
## TeX packages as requested by the community
&& curl -sSLO https://yihui.org/gh/tinytex/tools/pkgs-yihui.txt \
&& tlmgr install $(cat pkgs-yihui.txt | tr '\n' ' ') \
&& rm -f pkgs-yihui.txt \
## TeX packages as in rocker/verse
&& tlmgr install \
context \
pdfcrop \
## TeX packages as in jupyter/scipy-notebook
&& tlmgr install \
cm-super \
dvipng \
## TeX packages specific for nbconvert
&& tlmgr install \
oberdiek \
titling \
&& tlmgr path add \
&& Rscript -e "tinytex::r_texmf()" \
&& chown -R root:${NB_GID} /opt/TinyTeX \
&& chmod -R g+w /opt/TinyTeX \
&& chmod -R g+wx /opt/TinyTeX/bin \
## Make the TeX Live fonts available as system fonts
&& cp /opt/TinyTeX/texmf-var/fonts/conf/texlive-fontconfig.conf \
/etc/fonts/conf.d/09-texlive.conf \
&& fc-cache -fsv \
&& install2.r --error --skipinstalled -n $NCPUS PKI \
## And some nice R packages for publishing-related stuff
&& install2.r --error --deps TRUE --skipinstalled -n $NCPUS \
blogdown \
bookdown \
distill \
quarto \
rticles \
rJava \
xaringan \
## Install rmdshower
## Archived on 2023-08-18 as email to the maintainer is undeliverable.
&& curl -sLO https://cran.r-project.org/src/contrib/Archive/rmdshower/rmdshower_2.1.1.tar.gz \
&& R CMD INSTALL rmdshower_2.1.1.tar.gz \
## Install Cairo: R Graphics Device using Cairo Graphics Library
## Install magick: Advanced Graphics and Image-Processing in R
&& install2.r --error --skipinstalled -n $NCPUS \
Cairo \
magick \
## Get rid of libharfbuzz-dev
&& apt-get -y purge libharfbuzz-dev \
## Get rid of libmagick++-dev
&& apt-get -y purge libmagick++-dev \
## and their dependencies (incl. python3)
&& apt-get -y autoremove \
&& apt-get -y install --no-install-recommends \
imagemagick \
## Install code-server extensions
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension quarto.quarto \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension James-Yu.latex-workshop \
## Strip libraries of binary packages installed from PPM
&& strip $(R RHOME)/site-library/*/libs/*.so \
## Clean up
&& rm -rf /tmp/* \
&& rm -rf /var/lib/apt/lists/* \
${HOME}/.config \
${HOME}/.local \
${HOME}/.vscode-remote \
${HOME}/.wget-hsts
## Switch back to ${NB_USER} to avoid accidental container runs as root
USER ${NB_USER}
ENV HOME=/home/${NB_USER}
WORKDIR ${HOME}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment