kopia lustrzana https://github.com/jupyterhub/repo2docker
Start RStudio if R is installed via conda
rodzic
db9f1ff9ce
commit
e89378aea0
|
@ -0,0 +1,76 @@
|
||||||
|
"""
|
||||||
|
Base information for using R in BuildPacks.
|
||||||
|
|
||||||
|
Keeping this in r.py would lead to cyclic imports.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Via https://rstudio.com/products/rstudio/download-server/debian-ubuntu/
|
||||||
|
RSTUDIO_URL = "https://download2.rstudio.org/server/bionic/amd64/rstudio-server-1.2.5001-amd64.deb"
|
||||||
|
# This is MD5, because that is what RStudio download page provides!
|
||||||
|
RSTUDIO_CHECKSUM = "d33881b9ab786c09556c410e7dc477de"
|
||||||
|
|
||||||
|
# Via https://www.rstudio.com/products/shiny/download-server/
|
||||||
|
SHINY_URL = "https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.12.933-amd64.deb"
|
||||||
|
SHINY_CHECKSUM = "9aeef6613e7f58f21c97a4600921340e"
|
||||||
|
|
||||||
|
# Version of MRAN to pull devtools from.
|
||||||
|
DEVTOOLS_VERSION = "2018-02-01"
|
||||||
|
|
||||||
|
# IRKernel version - specified as a tag in the IRKernel repository
|
||||||
|
IRKERNEL_VERSION = "1.0.2"
|
||||||
|
|
||||||
|
|
||||||
|
def rstudio_base_scripts():
|
||||||
|
"""Base steps to install RStudio and shiny-server."""
|
||||||
|
return [
|
||||||
|
(
|
||||||
|
"root",
|
||||||
|
# Install RStudio!
|
||||||
|
r"""
|
||||||
|
curl --silent --location --fail {rstudio_url} > /tmp/rstudio.deb && \
|
||||||
|
echo '{rstudio_checksum} /tmp/rstudio.deb' | md5sum -c - && \
|
||||||
|
apt-get update && \
|
||||||
|
apt install -y /tmp/rstudio.deb && \
|
||||||
|
rm /tmp/rstudio.deb && \
|
||||||
|
apt-get -qq purge && \
|
||||||
|
apt-get -qq clean && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
""".format(
|
||||||
|
rstudio_url=RSTUDIO_URL, rstudio_checksum=RSTUDIO_CHECKSUM
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"root",
|
||||||
|
# Install Shiny Server!
|
||||||
|
r"""
|
||||||
|
curl --silent --location --fail {url} > {deb} && \
|
||||||
|
echo '{checksum} {deb}' | md5sum -c - && \
|
||||||
|
dpkg -i {deb} && \
|
||||||
|
rm {deb}
|
||||||
|
""".format(
|
||||||
|
url=SHINY_URL, checksum=SHINY_CHECKSUM, deb="/tmp/shiny.deb"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"${NB_USER}",
|
||||||
|
# Install nbrsessionproxy
|
||||||
|
r"""
|
||||||
|
pip install --no-cache-dir https://github.com/jupyterhub/jupyter-server-proxy/archive/7ac0125.zip && \
|
||||||
|
pip install --no-cache-dir jupyter-rsession-proxy==1.0b6 && \
|
||||||
|
jupyter serverextension enable jupyter_server_proxy --sys-prefix && \
|
||||||
|
jupyter nbextension install --py jupyter_server_proxy --sys-prefix && \
|
||||||
|
jupyter nbextension enable --py jupyter_server_proxy --sys-prefix
|
||||||
|
""",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
# Not all of these locations are configurable; so we make sure
|
||||||
|
# they exist and have the correct permissions
|
||||||
|
"root",
|
||||||
|
r"""
|
||||||
|
install -o ${NB_USER} -g ${NB_USER} -d /var/log/shiny-server && \
|
||||||
|
install -o ${NB_USER} -g ${NB_USER} -d /var/lib/shiny-server && \
|
||||||
|
install -o ${NB_USER} -g ${NB_USER} /dev/null /var/log/shiny-server.log && \
|
||||||
|
install -o ${NB_USER} -g ${NB_USER} /dev/null /var/run/shiny-server.pid
|
||||||
|
""",
|
||||||
|
),
|
||||||
|
]
|
|
@ -6,10 +6,12 @@ from collections import Mapping
|
||||||
from ruamel.yaml import YAML
|
from ruamel.yaml import YAML
|
||||||
|
|
||||||
from ..base import BaseImage
|
from ..base import BaseImage
|
||||||
|
from .._r_base import rstudio_base_scripts, IRKERNEL_VERSION
|
||||||
from ...utils import is_local_pip_requirement
|
from ...utils import is_local_pip_requirement
|
||||||
|
|
||||||
# pattern for parsing conda dependency line
|
# pattern for parsing conda dependency line
|
||||||
PYTHON_REGEX = re.compile(r"python\s*=+\s*([\d\.]*)")
|
PYTHON_REGEX = re.compile(r"python\s*=+\s*([\d\.]*)")
|
||||||
|
R_REGEX = re.compile(r"r-base\s*=+\s*([\d\.]*)")
|
||||||
# current directory
|
# current directory
|
||||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
@ -179,6 +181,7 @@ class CondaBuildPack(BaseImage):
|
||||||
Will return 'x.y' if version is found (e.g '3.6'),
|
Will return 'x.y' if version is found (e.g '3.6'),
|
||||||
or a Falsy empty string '' if not found.
|
or a Falsy empty string '' if not found.
|
||||||
|
|
||||||
|
Version information below the minor level is dropped.
|
||||||
"""
|
"""
|
||||||
if not hasattr(self, "_python_version"):
|
if not hasattr(self, "_python_version"):
|
||||||
py_version = None
|
py_version = None
|
||||||
|
@ -204,6 +207,40 @@ class CondaBuildPack(BaseImage):
|
||||||
|
|
||||||
return self._python_version
|
return self._python_version
|
||||||
|
|
||||||
|
@property
|
||||||
|
def r_version(self):
|
||||||
|
"""Detect the Python version for a given `environment.yml`
|
||||||
|
|
||||||
|
Will return 'x.y' if version is found (e.g '3.6'),
|
||||||
|
or a Falsy empty string '' if not found.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if not hasattr(self, "_r_version"):
|
||||||
|
self._r_version = ""
|
||||||
|
env = self.environment_yaml
|
||||||
|
for dep in env.get("dependencies", []):
|
||||||
|
if not isinstance(dep, str):
|
||||||
|
continue
|
||||||
|
match = R_REGEX.match(dep)
|
||||||
|
if not match:
|
||||||
|
continue
|
||||||
|
self._r_version = match.group(1)
|
||||||
|
break
|
||||||
|
|
||||||
|
return self._r_version
|
||||||
|
|
||||||
|
@property
|
||||||
|
def uses_r(self):
|
||||||
|
"""Detect whether the user also installs R packages.
|
||||||
|
|
||||||
|
Will return True when a package prefixed with 'r-' is being installed.
|
||||||
|
"""
|
||||||
|
if not hasattr(self, "_uses_r"):
|
||||||
|
deps = self.environment_yaml.get("dependencies", [])
|
||||||
|
self._uses_r = any(dep.startswith("r-") for dep in deps)
|
||||||
|
|
||||||
|
return self._uses_r
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def py2(self):
|
def py2(self):
|
||||||
"""Am I building a Python 2 kernel environment?"""
|
"""Am I building a Python 2 kernel environment?"""
|
||||||
|
@ -241,6 +278,46 @@ class CondaBuildPack(BaseImage):
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if self.uses_r:
|
||||||
|
if self.r_version:
|
||||||
|
r_pin = "=" + self.r_version
|
||||||
|
else:
|
||||||
|
r_pin = ""
|
||||||
|
scripts.append(
|
||||||
|
(
|
||||||
|
"${NB_USER}",
|
||||||
|
r"""
|
||||||
|
conda install -p {0} r-base{1} r-irkernel={2} r-devtools && \
|
||||||
|
conda clean --all -f -y && \
|
||||||
|
conda list -p {0}
|
||||||
|
""".format(
|
||||||
|
env_prefix, r_pin, IRKERNEL_VERSION
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
scripts += rstudio_base_scripts()
|
||||||
|
scripts += [
|
||||||
|
(
|
||||||
|
"root",
|
||||||
|
r"""
|
||||||
|
echo auth-none=1 >> /etc/rstudio/rserver.conf && \
|
||||||
|
echo auth-minimum-user-id=0 >> /etc/rstudio/rserver.conf && \
|
||||||
|
echo "rsession-which-r={0}/bin/R" >> /etc/rstudio/rserver.conf
|
||||||
|
""".format(
|
||||||
|
env_prefix
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"${NB_USER}",
|
||||||
|
# Install a pinned version of IRKernel and set it up for use!
|
||||||
|
r"""
|
||||||
|
R --quiet -e "IRkernel::installspec(prefix='{0}')"
|
||||||
|
""".format(
|
||||||
|
env_prefix
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
return scripts
|
return scripts
|
||||||
|
|
||||||
def get_preassemble_scripts(self):
|
def get_preassemble_scripts(self):
|
||||||
|
|
|
@ -5,6 +5,7 @@ import datetime
|
||||||
from distutils.version import LooseVersion as V
|
from distutils.version import LooseVersion as V
|
||||||
|
|
||||||
from .python import PythonBuildPack
|
from .python import PythonBuildPack
|
||||||
|
from ._r_base import rstudio_base_scripts, DEVTOOLS_VERSION, IRKERNEL_VERSION
|
||||||
|
|
||||||
|
|
||||||
class RBuildPack(PythonBuildPack):
|
class RBuildPack(PythonBuildPack):
|
||||||
|
@ -206,21 +207,6 @@ class RBuildPack(PythonBuildPack):
|
||||||
contents of runtime.txt.
|
contents of runtime.txt.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Via https://rstudio.com/products/rstudio/download-server/debian-ubuntu/
|
|
||||||
rstudio_url = "https://download2.rstudio.org/server/bionic/amd64/rstudio-server-1.2.5001-amd64.deb"
|
|
||||||
# This is MD5, because that is what RStudio download page provides!
|
|
||||||
rstudio_checksum = "d33881b9ab786c09556c410e7dc477de"
|
|
||||||
|
|
||||||
# Via https://www.rstudio.com/products/shiny/download-server/
|
|
||||||
shiny_url = "https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.12.933-amd64.deb"
|
|
||||||
shiny_checksum = "9aeef6613e7f58f21c97a4600921340e"
|
|
||||||
|
|
||||||
# Version of MRAN to pull devtools from.
|
|
||||||
devtools_version = "2018-02-01"
|
|
||||||
|
|
||||||
# IRKernel version - specified as a tag in the IRKernel repository
|
|
||||||
irkernel_version = "1.0.2"
|
|
||||||
|
|
||||||
mran_url = "https://mran.microsoft.com/snapshot/{}".format(
|
mran_url = "https://mran.microsoft.com/snapshot/{}".format(
|
||||||
self.checkpoint_date.isoformat()
|
self.checkpoint_date.isoformat()
|
||||||
)
|
)
|
||||||
|
@ -261,38 +247,17 @@ class RBuildPack(PythonBuildPack):
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
scripts += [
|
scripts.append(
|
||||||
(
|
(
|
||||||
"root",
|
"root",
|
||||||
r"""
|
r"""
|
||||||
mkdir -p ${R_LIBS_USER} && \
|
mkdir -p ${R_LIBS_USER} && \
|
||||||
chown -R ${NB_USER}:${NB_USER} ${R_LIBS_USER}
|
chown -R ${NB_USER}:${NB_USER} ${R_LIBS_USER}
|
||||||
""",
|
""",
|
||||||
),
|
)
|
||||||
(
|
)
|
||||||
"root",
|
scripts += rstudio_base_scripts()
|
||||||
# Install RStudio!
|
scripts += [
|
||||||
r"""
|
|
||||||
curl --silent --location --fail {rstudio_url} > /tmp/rstudio.deb && \
|
|
||||||
echo '{rstudio_checksum} /tmp/rstudio.deb' | md5sum -c - && \
|
|
||||||
dpkg -i /tmp/rstudio.deb && \
|
|
||||||
rm /tmp/rstudio.deb
|
|
||||||
""".format(
|
|
||||||
rstudio_url=rstudio_url, rstudio_checksum=rstudio_checksum
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"root",
|
|
||||||
# Install Shiny Server!
|
|
||||||
r"""
|
|
||||||
curl --silent --location --fail {url} > {deb} && \
|
|
||||||
echo '{checksum} {deb}' | md5sum -c - && \
|
|
||||||
dpkg -i {deb} && \
|
|
||||||
rm {deb}
|
|
||||||
""".format(
|
|
||||||
url=shiny_url, checksum=shiny_checksum, deb="/tmp/shiny.deb"
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
(
|
||||||
"root",
|
"root",
|
||||||
# Set paths so that RStudio shares libraries with base R
|
# Set paths so that RStudio shares libraries with base R
|
||||||
|
@ -303,17 +268,6 @@ class RBuildPack(PythonBuildPack):
|
||||||
echo "R_LIBS_USER=${R_LIBS_USER}" >> /etc/R/Renviron
|
echo "R_LIBS_USER=${R_LIBS_USER}" >> /etc/R/Renviron
|
||||||
""",
|
""",
|
||||||
),
|
),
|
||||||
(
|
|
||||||
"${NB_USER}",
|
|
||||||
# Install nbrsessionproxy
|
|
||||||
r"""
|
|
||||||
pip install --no-cache-dir https://github.com/jupyterhub/jupyter-server-proxy/archive/7ac0125.zip && \
|
|
||||||
pip install --no-cache-dir jupyter-rsession-proxy==1.0b6 && \
|
|
||||||
jupyter serverextension enable jupyter_server_proxy --sys-prefix && \
|
|
||||||
jupyter nbextension install --py jupyter_server_proxy --sys-prefix && \
|
|
||||||
jupyter nbextension enable --py jupyter_server_proxy --sys-prefix
|
|
||||||
""",
|
|
||||||
),
|
|
||||||
(
|
(
|
||||||
"${NB_USER}",
|
"${NB_USER}",
|
||||||
# Install a pinned version of IRKernel and set it up for use!
|
# Install a pinned version of IRKernel and set it up for use!
|
||||||
|
@ -322,7 +276,7 @@ class RBuildPack(PythonBuildPack):
|
||||||
R --quiet -e "devtools::install_github('IRkernel/IRkernel', ref='{irkernel_version}')" && \
|
R --quiet -e "devtools::install_github('IRkernel/IRkernel', ref='{irkernel_version}')" && \
|
||||||
R --quiet -e "IRkernel::installspec(prefix='$NB_PYTHON_PREFIX')"
|
R --quiet -e "IRkernel::installspec(prefix='$NB_PYTHON_PREFIX')"
|
||||||
""".format(
|
""".format(
|
||||||
devtools_version=devtools_version, irkernel_version=irkernel_version
|
devtools_version=DEVTOOLS_VERSION, irkernel_version=IRKERNEL_VERSION
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
@ -344,17 +298,6 @@ class RBuildPack(PythonBuildPack):
|
||||||
mran_url=mran_url
|
mran_url=mran_url
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
|
||||||
# Not all of these locations are configurable; so we make sure
|
|
||||||
# they exist and have the correct permissions
|
|
||||||
"root",
|
|
||||||
r"""
|
|
||||||
install -o ${NB_USER} -g ${NB_USER} -d /var/log/shiny-server && \
|
|
||||||
install -o ${NB_USER} -g ${NB_USER} -d /var/lib/shiny-server && \
|
|
||||||
install -o ${NB_USER} -g ${NB_USER} /dev/null /var/log/shiny-server.log && \
|
|
||||||
install -o ${NB_USER} -g ${NB_USER} /dev/null /var/run/shiny-server.pid
|
|
||||||
""",
|
|
||||||
),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if "r" in self.stencila_contexts:
|
if "r" in self.stencila_contexts:
|
||||||
|
|
Ładowanie…
Reference in New Issue