今天需要部署个Rstudio给别人用, 记录一下部署的步骤以及要点
前言
Rstudio的运行是必须要靠Root权限来运行的, 不能像Jupyter那样conda或者mamba直装, 因此本次的部署使用了Singularity这种容器(也是我第一次实操使用). Sigularity与Docker或者Podmon在设计上有较大的不同, 主要为HPC环境下的应用而生, 权限管理有较大的不同. 不过这些都不太影响本次使用就是. Sigularity的安装在Rocky Linux下比较简单, 我记得是直接包管理器就能安装了, 因此不作记录
1. 容器准备
虽然与Docker是不同的容器技术, Sigularity却提供了完善的Docker镜像兼容支持, 构建好的Docker容器可以很方便的被转换到Sigularity使用的sif
格式镜像. 本次部署参考的是rstudio-server-conda项目中的说明, 直接使用singularity pull docker://rocker/rstudio:4.2
拉取docker镜像转换为sif
镜像使用
2. 必要文件准备
使用如下的bash脚本生成需要的若干目录和配置文件
1 | mkdir -p run var-lib-rstudio-server |
这样一来将生成run
, var-lib-rstudio-server
两个文件夹, 以及database.conf
, rserver.conf
, rsession.conf
三个配置文件. 其中rserver.conf
里的auth-minimum-user-id=100
配置非常重要, 因为在使用的容器中, Rstudio是以uid为999的rstudio用户来运行的, 如果没有这个用户或者没有切换到该用户的权限, 容器无法正常运行. 因此我参考网上帖子中的说法使用--server-user
参数制定用当前用户运行服务.
然而好巧不巧, 当前用户的uid小于513, 而auth-minimum-user-id
这一参数默认为1000, 即禁止用户uid小于1000的用户运行服务(似乎是出于安全考虑). 因此就需要在rserver.conf
里变更参数数值, 来让服务能正常的启动.
3. 指定参数启动容器
使用如下命令启动服务即可, 运行的命令主要是将前面创建的目录和配置文件绑定到容器中供服务读取, 另外就是指定了ip与端口方便访问. 由于是担任使用, 就没有弄验证的东西了. 另外还参照rstudio-server-conda项目中的内容制定了使用的conda环境, 这样就不用在容器中重复安装R包了.
1 | singularity exec \ |
启动后界面如下:
4. 注意
Sigularity感觉上会更类似snap和flathub这种软件打包的项目, 宿主机和容器间并不是被那么完全的被隔开. Rstudio启动后, 直接可以访问到宿主机用户的Home目录, 不知道这是这个容器的特殊表现还是Sigularity都是如此? 之后我们需要对内部的分析流程做依赖梳理和容器话… 看来还需要更多的了解Sigularity的原理和使用方式.