mirror of
https://github.com/jupyter/docker-stacks.git
synced 2025-10-10 19:42:58 +00:00
Automatically install latest julia version (#2046)
* Automatically install latest julia version * Better text * Fix * Fix * Update setup-julia.bash * Install plumbum * Better docs * Better docs * Use subprocess.check_call instead of plumbum * Do not use dash in python filename * Remove plumbum from the image * Remove jq from the image * Remove setup-julia.bash file * Fix file name * Fix docstring
This commit is contained in:
@@ -27,7 +27,7 @@ ENV JULIA_DEPOT_PATH=/opt/julia \
|
|||||||
JULIA_PKGDIR=/opt/julia
|
JULIA_PKGDIR=/opt/julia
|
||||||
|
|
||||||
# Setup Julia
|
# Setup Julia
|
||||||
RUN /opt/setup-scripts/setup-julia.bash
|
RUN /opt/setup-scripts/setup_julia.py
|
||||||
|
|
||||||
USER ${NB_UID}
|
USER ${NB_UID}
|
||||||
|
|
||||||
|
@@ -19,7 +19,7 @@ ENV JULIA_DEPOT_PATH=/opt/julia \
|
|||||||
JULIA_PKGDIR=/opt/julia
|
JULIA_PKGDIR=/opt/julia
|
||||||
|
|
||||||
# Setup Julia
|
# Setup Julia
|
||||||
RUN /opt/setup-scripts/setup-julia.bash
|
RUN /opt/setup-scripts/setup_julia.py
|
||||||
|
|
||||||
USER ${NB_UID}
|
USER ${NB_UID}
|
||||||
|
|
||||||
|
@@ -1,40 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -exuo pipefail
|
|
||||||
# Requirements:
|
|
||||||
# - 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.3}"
|
|
||||||
|
|
||||||
# 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}"
|
|
||||||
curl --progress-bar --location --output "${JULIA_INSTALLER}" \
|
|
||||||
"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}"
|
|
85
images/minimal-notebook/setup-scripts/setup_julia.py
Executable file
85
images/minimal-notebook/setup-scripts/setup_julia.py
Executable file
@@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) Jupyter Development Team.
|
||||||
|
# Distributed under the terms of the Modified BSD License.
|
||||||
|
|
||||||
|
# Requirements:
|
||||||
|
# - Run as the root user
|
||||||
|
# - The JULIA_PKGDIR environment variable is set
|
||||||
|
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
def unify_aarch64(platform: str) -> str:
|
||||||
|
"""
|
||||||
|
Renames arm64->aarch64 to support local builds on on aarch64 Macs
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
"aarch64": "aarch64",
|
||||||
|
"arm64": "aarch64",
|
||||||
|
"x86_64": "x86_64",
|
||||||
|
}[platform]
|
||||||
|
|
||||||
|
|
||||||
|
def get_latest_julia_url() -> tuple[str, str]:
|
||||||
|
"""
|
||||||
|
Get the last stable version of Julia
|
||||||
|
Based on: https://github.com/JuliaLang/www.julialang.org/issues/878#issuecomment-749234813
|
||||||
|
"""
|
||||||
|
|
||||||
|
versions = requests.get(
|
||||||
|
"https://julialang-s3.julialang.org/bin/versions.json"
|
||||||
|
).json()
|
||||||
|
stable_versions = {k: v for k, v in versions.items() if v["stable"]}
|
||||||
|
latest_version_files = stable_versions[max(stable_versions)]["files"]
|
||||||
|
triplet = unify_aarch64(platform.machine()) + "-linux-gnu"
|
||||||
|
file_info = [vf for vf in latest_version_files if vf["triplet"] == triplet][0]
|
||||||
|
return file_info["url"], file_info["version"]
|
||||||
|
|
||||||
|
|
||||||
|
def download_julia(julia_url: str) -> None:
|
||||||
|
"""
|
||||||
|
Downloads and unpacks julia
|
||||||
|
The resulting julia directory is "/opt/julia-VERSION/"
|
||||||
|
"""
|
||||||
|
tmp_file = Path("/tmp/julia.tar.gz")
|
||||||
|
subprocess.check_call(
|
||||||
|
["curl", "--progress-bar", "--location", "--output", tmp_file, julia_url]
|
||||||
|
)
|
||||||
|
shutil.unpack_archive(tmp_file, "/opt/")
|
||||||
|
tmp_file.unlink()
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_julia(julia_version: str) -> None:
|
||||||
|
"""
|
||||||
|
Creates /usr/local/bin/julia symlink
|
||||||
|
Make Julia aware of conda libraries
|
||||||
|
Creates a directory for Julia user libraries
|
||||||
|
"""
|
||||||
|
# Link Julia installed version to /usr/local/bin, so julia launches it
|
||||||
|
subprocess.check_call(
|
||||||
|
["ln", "-fs", f"/opt/julia-{julia_version}/bin/julia", "/usr/local/bin/julia"]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Tell Julia where conda libraries are
|
||||||
|
Path("/etc/julia").mkdir()
|
||||||
|
Path("/etc/julia/juliarc.jl").write_text(
|
||||||
|
f'push!(Libdl.DL_LOAD_PATH, "{os.environ["CONDA_DIR"]}/lib")\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create JULIA_PKGDIR, where user libraries are installed
|
||||||
|
JULIA_PKGDIR = Path(os.environ["JULIA_PKGDIR"])
|
||||||
|
JULIA_PKGDIR.mkdir()
|
||||||
|
subprocess.check_call(["chown", os.environ["NB_USER"], JULIA_PKGDIR])
|
||||||
|
subprocess.check_call(["fix-permissions", JULIA_PKGDIR])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
julia_url, julia_version = get_latest_julia_url()
|
||||||
|
download_julia(julia_url=julia_url)
|
||||||
|
prepare_julia(julia_version=julia_version)
|
@@ -6,9 +6,12 @@ ALL_PLATFORMS = {"x86_64", "aarch64"}
|
|||||||
|
|
||||||
|
|
||||||
def unify_aarch64(platform: str) -> str:
|
def unify_aarch64(platform: str) -> str:
|
||||||
|
"""
|
||||||
|
Renames arm64->aarch64 to support local builds on on aarch64 Macs
|
||||||
|
"""
|
||||||
return {
|
return {
|
||||||
"aarch64": "aarch64",
|
"aarch64": "aarch64",
|
||||||
"arm64": "aarch64", # To support local building on aarch64 Macs
|
"arm64": "aarch64",
|
||||||
"x86_64": "x86_64",
|
"x86_64": "x86_64",
|
||||||
}[platform]
|
}[platform]
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user