diff --git a/datascience-notebook/Dockerfile b/datascience-notebook/Dockerfile index 571f93fb..4833fef3 100644 --- a/datascience-notebook/Dockerfile +++ b/datascience-notebook/Dockerfile @@ -12,12 +12,6 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] USER root -# Julia installation -# Default values can be overridden at build time -# (ARGS are in lower case to distinguish them from ENV) -# Check https://julialang.org/downloads/ -ARG julia_version="1.9.1" - # R pre-requisites RUN apt-get update --yes && \ apt-get install --yes --no-install-recommends \ @@ -29,36 +23,16 @@ RUN apt-get update --yes && \ # Julia dependencies # install Julia packages in /opt/julia instead of ${HOME} ENV JULIA_DEPOT_PATH=/opt/julia \ - JULIA_PKGDIR=/opt/julia \ - JULIA_VERSION="${julia_version}" + JULIA_PKGDIR=/opt/julia -WORKDIR /tmp - -# hadolint ignore=SC2046 -RUN set -x && \ - julia_arch=$(uname -m) && \ - julia_short_arch="${julia_arch}" && \ - if [ "${julia_short_arch}" == "x86_64" ]; then \ - julia_short_arch="x64"; \ - fi; \ - julia_installer="julia-${JULIA_VERSION}-linux-${julia_arch}.tar.gz" && \ - julia_major_minor=$(echo "${JULIA_VERSION}" | cut -d. -f 1,2) && \ - mkdir "/opt/julia-${JULIA_VERSION}" && \ - wget --progress=dot:giga "https://julialang-s3.julialang.org/bin/linux/${julia_short_arch}/${julia_major_minor}/${julia_installer}" && \ - tar xzf "${julia_installer}" -C "/opt/julia-${JULIA_VERSION}" --strip-components=1 && \ - rm "${julia_installer}" && \ - ln -fs /opt/julia-*/bin/julia /usr/local/bin/julia - -# Show Julia where conda libraries are \ -RUN mkdir /etc/julia && \ - echo "push!(Libdl.DL_LOAD_PATH, \"${CONDA_DIR}/lib\")" >> /etc/julia/juliarc.jl && \ - # Create JULIA_PKGDIR \ - mkdir "${JULIA_PKGDIR}" && \ - chown "${NB_USER}" "${JULIA_PKGDIR}" && \ - fix-permissions "${JULIA_PKGDIR}" +# Setup Julia +RUN /opt/setup-scripts/setup-julia.bash USER ${NB_UID} +# Setup IJulia kernel & other packages +RUN /opt/setup-scripts/setup-julia-packages.bash + # R packages including IRKernel which gets installed globally. # r-e1071: dependency of the caret R package RUN mamba install --yes \ @@ -86,18 +60,3 @@ RUN mamba install --yes \ mamba clean --all -f -y && \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" - -# Add Julia packages. -# Install IJulia as jovyan and then move the kernelspec out -# to the system share location. Avoids problems with runtime UID change not -# taking effect properly on the .local folder in the jovyan home dir. -RUN julia -e 'import Pkg; Pkg.update()' && \ - julia -e 'import Pkg; Pkg.add("HDF5")' && \ - julia -e 'using Pkg; pkg"add IJulia"; pkg"precompile"' && \ - # move kernelspec out of home \ - mv "${HOME}/.local/share/jupyter/kernels/julia"* "${CONDA_DIR}/share/jupyter/kernels/" && \ - chmod -R go+rx "${CONDA_DIR}/share/jupyter" && \ - rm -rf "${HOME}/.local" && \ - fix-permissions "${JULIA_PKGDIR}" "${CONDA_DIR}/share/jupyter" - -WORKDIR "${HOME}" diff --git a/julia-notebook/Dockerfile b/julia-notebook/Dockerfile index 5ab6b917..cee9aa99 100644 --- a/julia-notebook/Dockerfile +++ b/julia-notebook/Dockerfile @@ -12,56 +12,15 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] USER root -# Julia installation -# Default values can be overridden at build time -# (ARGS are in lower case to distinguish them from ENV) -# Check https://julialang.org/downloads/ -ARG julia_version="1.9.1" - # Julia dependencies # install Julia packages in /opt/julia instead of ${HOME} ENV JULIA_DEPOT_PATH=/opt/julia \ - JULIA_PKGDIR=/opt/julia \ - JULIA_VERSION="${julia_version}" + JULIA_PKGDIR=/opt/julia -WORKDIR /tmp - -# hadolint ignore=SC2046 -RUN set -x && \ - julia_arch=$(uname -m) && \ - julia_short_arch="${julia_arch}" && \ - if [ "${julia_short_arch}" == "x86_64" ]; then \ - julia_short_arch="x64"; \ - fi; \ - julia_installer="julia-${JULIA_VERSION}-linux-${julia_arch}.tar.gz" && \ - julia_major_minor=$(echo "${JULIA_VERSION}" | cut -d. -f 1,2) && \ - mkdir "/opt/julia-${JULIA_VERSION}" && \ - wget --progress=dot:giga "https://julialang-s3.julialang.org/bin/linux/${julia_short_arch}/${julia_major_minor}/${julia_installer}" && \ - tar xzf "${julia_installer}" -C "/opt/julia-${JULIA_VERSION}" --strip-components=1 && \ - rm "${julia_installer}" && \ - ln -fs /opt/julia-*/bin/julia /usr/local/bin/julia - -# Show Julia where conda libraries are \ -RUN mkdir /etc/julia && \ - echo "push!(Libdl.DL_LOAD_PATH, \"${CONDA_DIR}/lib\")" >> /etc/julia/juliarc.jl && \ - # Create JULIA_PKGDIR \ - mkdir "${JULIA_PKGDIR}" && \ - chown "${NB_USER}" "${JULIA_PKGDIR}" && \ - fix-permissions "${JULIA_PKGDIR}" +# Setup Julia +RUN /opt/setup-scripts/setup-julia.bash USER ${NB_UID} -# Add Julia packages. -# Install IJulia as jovyan and then move the kernelspec out -# to the system share location. Avoids problems with runtime UID change not -# taking effect properly on the .local folder in the jovyan home dir. -RUN julia -e 'import Pkg; Pkg.update()' && \ - julia -e 'import Pkg; Pkg.add("HDF5")' && \ - julia -e 'using Pkg; pkg"add IJulia"; pkg"precompile"' && \ - # move kernelspec out of home \ - mv "${HOME}/.local/share/jupyter/kernels/julia"* "${CONDA_DIR}/share/jupyter/kernels/" && \ - chmod -R go+rx "${CONDA_DIR}/share/jupyter" && \ - rm -rf "${HOME}/.local" && \ - fix-permissions "${JULIA_PKGDIR}" "${CONDA_DIR}/share/jupyter" - -WORKDIR "${HOME}" +# Setup IJulia kernel & other packages +RUN /opt/setup-scripts/setup-julia-packages.bash diff --git a/minimal-notebook/Dockerfile b/minimal-notebook/Dockerfile index 47415614..a998d2a1 100644 --- a/minimal-notebook/Dockerfile +++ b/minimal-notebook/Dockerfile @@ -43,3 +43,6 @@ USER ${NB_UID} # Add R mimetype option to specify how the plot returns from R to the browser COPY --chown=${NB_UID}:${NB_GID} Rprofile.site /opt/conda/lib/R/etc/ + +# Add setup scripts that may be used by downstream images or inherited images +COPY setup-scripts/ /opt/setup-scripts/ diff --git a/minimal-notebook/setup-scripts/setup-julia-packages.bash b/minimal-notebook/setup-scripts/setup-julia-packages.bash new file mode 100755 index 00000000..70ab730a --- /dev/null +++ b/minimal-notebook/setup-scripts/setup-julia-packages.bash @@ -0,0 +1,24 @@ +#!/bin/bash +# Requirements: +# - Run as non-root user +# - Julia is already set up, with the setup-julia.bash command +set -exuo pipefail + +# Install base Julia packages +julia -e ' +import Pkg; +Pkg.update(); +Pkg.add([ + "HDF5", + "IJulia" +]); +Pkg.precompile(); +' + +# Move the kernelspec out to the system share location. Avoids +# problems with runtime UID change not taking effect properly on the +# .local folder in the jovyan home dir. move kernelspec out of home +mv "${HOME}/.local/share/jupyter/kernels/julia"* "${CONDA_DIR}/share/jupyter/kernels/" +chmod -R go+rx "${CONDA_DIR}/share/jupyter" +rm -rf "${HOME}/.local" +fix-permissions "${JULIA_PKGDIR}" "${CONDA_DIR}/share/jupyter" diff --git a/minimal-notebook/setup-scripts/setup-julia.bash b/minimal-notebook/setup-scripts/setup-julia.bash new file mode 100755 index 00000000..95a76581 --- /dev/null +++ b/minimal-notebook/setup-scripts/setup-julia.bash @@ -0,0 +1,39 @@ +#!/bin/bash +set -exuo pipefail +# Requirements: +# - This script is run as the root user +# - The JULIA_PKGDIR environment variable is set + +# Default julia version to install if env var is not set +# Check https://julialang.org/downloads/ +JULIA_VERSION="${JULIA_VERSION:-1.9.1}" + +# Figure out what architecture we are installing in +JULIA_ARCH=$(uname -m) +JULIA_SHORT_ARCH="${JULIA_ARCH}" +if [ "${JULIA_SHORT_ARCH}" == "x86_64" ]; then + JULIA_SHORT_ARCH="x64" +fi + +# Figure out Julia Installer URL +JULIA_INSTALLER="julia-${JULIA_VERSION}-linux-${JULIA_ARCH}.tar.gz" +JULIA_MAJOR_MINOR=$(echo "${JULIA_VERSION}" | cut -d. -f 1,2) + +# Download and install Julia +cd /tmp +mkdir "/opt/julia-${JULIA_VERSION}" +wget --progress=dot:giga "https://julialang-s3.julialang.org/bin/linux/${JULIA_SHORT_ARCH}/${JULIA_MAJOR_MINOR}/${JULIA_INSTALLER}" +tar xzf "${JULIA_INSTALLER}" -C "/opt/julia-${JULIA_VERSION}" --strip-components=1 +rm "${JULIA_INSTALLER}" + +# Link Julia installed version to /usr/local/bin, so julia launches it +ln -fs /opt/julia-*/bin/julia /usr/local/bin/julia + +# Tell Julia where conda libraries are +mkdir -p /etc/julia +echo "push!(Libdl.DL_LOAD_PATH, \"${CONDA_DIR}/lib\")" >> /etc/julia/juliarc.jl + +# Create JULIA_PKGDIR, where user libraries are installed +mkdir "${JULIA_PKGDIR}" +chown "${NB_USER}" "${JULIA_PKGDIR}" +fix-permissions "${JULIA_PKGDIR}"