Die*_*nne 4 r rstudio shiny docker
我正在寻找docker分发一个shiny也需要RStudio 的应用程序.主要目标是在Windows下的医院轻松安装.在非IT人员安装过程中,所有需要将字符输入黑盒子的东西肯定会失败.
我以前的尝试使用流浪汉,但单独安装流浪者证明是一个障碍.
该rocker资源库,有一个RStudio和光泽,并为自己的安装都一起工作.但是,我想创建一个组合的应用程序,以便于安装.
什么是推荐的工作流程?从RStudio开始,手动添加Shiny?或者从r-base开始合并两个Rockers的dockerfiles代码?或者使用撰写工具?
一般来说,Docker的意义在于隔离服务,以便在不影响其他服务的情况下更新/更改服务.我的建议是使用docker-compose,而不是.下面是一个示例docker-composeyaml文件,它使用Jason Wilder提供的令人难以置信的有用的docker-gen,在不同子域的同一服务器上同时提供rstudio和闪亮.下面使用的所有R docker图像均由Rocker或更直接的Rocker Docker Hub提供.这些都非常可靠,因为Dirk Eddelbeutel和Carl Boettiger制作了它们.在这个例子中,我还提供了一些RStudio选项,例如设置用户/通道以及用户是否具有root访问权限.有关使用此Wiki页面上提供的Rocker RStudio图像的更多说明:
更改以下内容:
nginx1:
image: nginx
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- /etc/nginx/conf.d
- /etc/nginx/vhost.d
- /usr/share/nginx/html
- /home/your_user/services/volumes/proxy/certs:/etc/nginx/certs:ro
nginx-gen:
links:
- "nginx1"
image: jwilder/docker-gen
container_name: nginx-gen
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /home/your_user/services/volumes/proxy/templates/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
volumes_from:
- nginx1
entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -only-exposed -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
rstudio:
links:
- "nginx1"
image: rocker/hadleyverse
container_name: rstudio
ports:
- "8787:8787"
environment:
- VIRTUAL_PORT=8787
- ROOT=TRUE
- VIRTUAL_HOST=rstudio.DOMAIN.tld
- USER=SOME_USER
- PASSWORD=SOME_PASS
shiny:
links:
- "nginx1"
image: rocker/shiny
container_name: shiny
environment:
- VIRTUAL_HOST=shiny.DOMAIN.tld
volumes:
- /home/your_user/services/volumes/shiny/apps:/srv/shiny-server/
- /home/your_user/services/volumes/shiny/logs:/var/log/
- /home/your_user/services/volumes/shiny/packages:/home/shiny/
Run Code Online (Sandbox Code Playgroud)
例如,添加博客等更多服务是微不足道的,只需按照模式或在互联网上搜索docker-compose您的服务版本并添加即可.
有趣的问题,但我不确定我是否理解从同一容器提供闪亮服务器和 rstudio-server 实例的优势。
目的是让两个容器共享相同的 R 库(例如,不需要在每个容器上单独安装软件包)还是仅仅拥有一个 docker 容器而不是两个?只需运行两个 docker 命令而不是一个似乎并不那么繁重,但也许我低估了。
不过,共享底层库似乎是一个有效的目标,而且我认为目前还没有理想的解决方案。
我觉得最像 docker 的解决方案是通过您提到的容器编排/撰写工具来完成此操作。这是组合单独服务(例如 Web 服务器和数据库)的常用方法,而无需将一个服务构建在另一个服务之上。
不幸的是,基于映射卷的编排工具远没有映射端口那么发达。
想象一下将 rstudio 作为卷容器运行:
docker run --name rstudio -v /usr/local/lib/R/site.library rocker/rstudio true
Run Code Online (Sandbox Code Playgroud)
(如果您想同时访问 RStudio,可以将其运行为:)
docker run --name rstudio -dP -v /usr/local/lib/R/site.library rocker/rstudio
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用 rstudio 容器中的 site.library 来代替闪亮容器上的 site.library,命令如下:
docker run --volumes-from rstudio -dP rocker/shiny
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会破坏容器site.library的结构shiny。要解决此问题,您需要将 rstudio 容器的库安装在不同的位置,但是没有像我们已经使用的端口链接那样的简单语法。不过这是可以做到的,请参阅:
如何使用 Docker 的 --volumes-from 映射卷路径?
在 rocker 仓库中也有一个关于这个问题的开放线程。