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 ..base import BaseImage
|
||||
from .._r_base import rstudio_base_scripts, IRKERNEL_VERSION
|
||||
from ...utils import is_local_pip_requirement
|
||||
|
||||
# pattern for parsing conda dependency line
|
||||
PYTHON_REGEX = re.compile(r"python\s*=+\s*([\d\.]*)")
|
||||
R_REGEX = re.compile(r"r-base\s*=+\s*([\d\.]*)")
|
||||
# current directory
|
||||
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'),
|
||||
or a Falsy empty string '' if not found.
|
||||
|
||||
Version information below the minor level is dropped.
|
||||
"""
|
||||
if not hasattr(self, "_python_version"):
|
||||
py_version = None
|
||||
|
@ -204,6 +207,40 @@ class CondaBuildPack(BaseImage):
|
|||
|
||||
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
|
||||
def py2(self):
|
||||
"""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
|
||||
|
||||
def get_preassemble_scripts(self):
|
||||
|
|
|
@ -5,6 +5,7 @@ import datetime
|
|||
from distutils.version import LooseVersion as V
|
||||
|
||||
from .python import PythonBuildPack
|
||||
from ._r_base import rstudio_base_scripts, DEVTOOLS_VERSION, IRKERNEL_VERSION
|
||||
|
||||
|
||||
class RBuildPack(PythonBuildPack):
|
||||
|
@ -206,21 +207,6 @@ class RBuildPack(PythonBuildPack):
|
|||
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(
|
||||
self.checkpoint_date.isoformat()
|
||||
)
|
||||
|
@ -261,38 +247,17 @@ class RBuildPack(PythonBuildPack):
|
|||
),
|
||||
]
|
||||
|
||||
scripts += [
|
||||
scripts.append(
|
||||
(
|
||||
"root",
|
||||
r"""
|
||||
mkdir -p ${R_LIBS_USER} && \
|
||||
chown -R ${NB_USER}:${NB_USER} ${R_LIBS_USER}
|
||||
""",
|
||||
),
|
||||
(
|
||||
"root",
|
||||
# Install RStudio!
|
||||
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"
|
||||
),
|
||||
),
|
||||
)
|
||||
)
|
||||
scripts += rstudio_base_scripts()
|
||||
scripts += [
|
||||
(
|
||||
"root",
|
||||
# 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
|
||||
""",
|
||||
),
|
||||
(
|
||||
"${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}",
|
||||
# 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 "IRkernel::installspec(prefix='$NB_PYTHON_PREFIX')"
|
||||
""".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
|
||||
),
|
||||
),
|
||||
(
|
||||
# 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:
|
||||
|
|
Ładowanie…
Reference in New Issue