RStudio 和 Shiny 在一个 dockerfile 中

RStudio and Shiny in one dockerfile

我正在研究 docker 以分发 shiny 也需要 RStudio 的应用程序。主要目标是在 Windows 下的医院轻松安装。凡是需要黑框输入字符的,非IT人员安装肯定会失败

我的 previous attempts 使用了 vagrant,但单独安装 vagrant 被证明是一个障碍。

rocker 存储库有一个 RStudio 和一个 Shiny ,对于我自己的安装,两者可以一起工作。但是,我想创建一个组合应用程序以便于安装。

推荐的工作流程是什么?从 RStudio 开始,手动添加 Shiny? 或者合并来自两个 Rockers 的 dockerfiles 代码,从 r-base 开始?或者使用撰写工具?

有些遗憾的是,没有明确的答案,这完全取决于您要寻找多少可重用性以及上游基础映像是否维护良好。这也是图像大小的权衡,层数越多,生成的图像就越大。

有趣的问题,但我不确定我是否理解从同一容器提供 shiny-server 和 rstudio-server 实例的优势。

目的是让两个容器共享相同的 R 库(例如,因此不需要在每个容器上单独安装一个包)还是仅仅有一个 docker 容器而不是两个?只需要 运行 两个 docker 命令而不是一个命令似乎并不那么繁重,但也许我低估了。

虽然共享底层库似乎是有效的 objective,但我认为目前还没有理想的解决方案。

我觉得最 docker 式的解决方案是通过您提到的容器 orchestration/compose 工具来实现。这是组合单独服务(例如 Web 服务器和数据库)而不在另一个之上构建一个服务的常用方法。

不幸的是,基于映射卷的编排工具远没有映射端口那么发达。

想象一下 运行将 rstudio 作为一个卷容器:

docker run --name rstudio -v /usr/local/lib/R/site.library rocker/rstudio true

(如果您希望同时访问 RStudio,可以将 运行 改为:)

docker run --name rstudio -dP -v /usr/local/lib/R/site.library rocker/rstudio

然后您可以使用 rstudio 容器中的 site.library 来代替 shiny 容器中的那个,命令如下:

docker run --volumes-from rstudio -dP rocker/shiny

不幸的是,这会破坏 shiny 容器的 site.library。要解决此问题,您需要将 rstudio 容器的库安装在不同的位置,但是没有简单的语法,就像我们已经拥有的端口链接一样。虽然可以做到,请参阅:

How to map volume paths using Docker's --volumes-from?

还有一个open thread on this issue in the rocker repo

我已经为

开发了一个工作单曲docker
  • R
  • RStudio(服务器)
  • Shiny Server(免费版)

我完全出于与@Dieter Menne 提到的相同原因构建它。它可能不适合 ops,但它适合开发人员(特别是如果团队成员都使用不同的环境。如 mac、windows 等)。

它在 Centos 6 上,因为这是环境。我在工作中使用。

这是docker文件:

FROM centos:centos6.7
MAINTAINER enzo smartinsightsfromdata 

RUN yum -y install epel-release
RUN yum update -y && yum clean all
# RUN yum reinstall -y glibc-common
RUN yum install -y locales java-1.7.0-openjdk-devel tar

# Misc packages

RUN yum groupinstall -y "Development Tools" 

# R devtools pre-requisites:
RUN yum install -y wget git xml2 libxml2-devel curl curl-devel openssl-devel


WORKDIR /home/root
RUN yum install -y R

RUN wget http://cran.r-project.org/src/contrib/rJava_0.9-7.tar.gz
RUN R CMD INSTALL rJava_0.9-7.tar.gz
RUN R CMD javareconf \
    && rm -rf rJava_0.9-7.tar.gz

#-----------------------

# Add RStudio binaries to PATH
# export PATH="/usr/lib/rstudio-server/bin/:$PATH"
ENV PATH /usr/lib/rstudio-server/bin/:$PATH 
ENV LANG en_US.UTF-8

RUN yum install -y openssl098e supervisor passwd pandoc

# RUN wget http://download2.rstudio.org/rstudio-server-rhel-0.99.484-x86_64.rpm
# Go for the bleading edge:
RUN wget https://s3.amazonaws.com/rstudio-dailybuilds/rstudio-server-rhel-0.99.697-x86_64.rpm
RUN yum -y install --nogpgcheck rstudio-server-rhel-0.99.697-x86_64.rpm \
    && rm -rf rstudio-server-rhel-0.99.484-x86_64.rpm

RUN groupadd rstudio \
    && useradd -g rstudio rstudio \
    && echo rstudio | passwd rstudio --stdin 

RUN R -e "install.packages(c('shiny', 'rmarkdown'), repos='http://cran.r-project.org', INSTALL_opts='--no-html')"
RUN wget https://download3.rstudio.org/centos5.9/x86_64/shiny-server-1.4.0.756-rh5-x86_64.rpm
RUN yum -y install --nogpgcheck shiny-server-1.4.0.756-rh5-x86_64.rpm \
    && rm -rf shiny-server-1.4.0.756-rh5-x86_64.rpm

RUN mkdir -p /var/log/shiny-server \
    && chown shiny:shiny /var/log/shiny-server \
    && chown shiny:shiny -R /srv/shiny-server \
    && chmod 777 -R /srv/shiny-server \
    && chown shiny:shiny -R /opt/shiny-server/samples/sample-apps \
    && chmod 777 -R /opt/shiny-server/samples/sample-apps 

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN mkdir -p /var/log/supervisor \
    && chmod 777 -R /var/log/supervisor


EXPOSE 8787 3838

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] 

这是 supervisord.conf 文件的样子:

[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log
pidfile = /tmp/supervisord.pid


[program:rserver]
user=root
command=/usr/lib/rstudio-server/bin/rserver
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
startsecs=0
autorestart=false

[program:shinyserver]
user=root
command=/usr/bin/shiny-server
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
autorestart=false

我的 github page: smartinsightsfromdata

有售

我还在centos上为shiny server pro开发了一个可以工作的docker(使用shiny server pro临时版,有效期只有45天)。

一般来说,Docker 的要点是隔离服务,这样它们就可以 updated/changed 而不影响其他服务。我的建议是改用 docker-compose。下面是一个示例 docker-compose yaml 文件,它使用非常有用的 docker-gen by Jason Wilder. All R docker images used below are courtesy of Rocker or more directly Rocker Docker Hub. These are very very reliable because, well, Dirk Eddelbeutel and Carl Boettiger made them. In this example I've also included some options for RStudio such as setting a user/pass and whether or not the user has root access. There are more instructions on using the Rocker RStudio image available on this wiki page:

在不同子域的同一服务器上同时提供 rstudio 和 shiny

更改以下内容:

  • your_user 到您在服务器上的用户名
  • SOME_USER 到您想要的 RStudio 用户名
  • SOME_PASS 到您想要的 Rstudio 密码
  • *.DOMAIN.tld 到您的域,不要忘记为您的子域添加 A 记录。

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/

添加更多服务(如博客)很简单,例如,只需按照模式或在互联网上搜索服务的 docker-compose 版本并添加即可。