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?
我已经为
开发了一个工作单曲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
版本并添加即可。
我正在研究 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?
我已经为
开发了一个工作单曲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:
更改以下内容:
- 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
版本并添加即可。