我正在研究docker,以发布一个同样需要RStudio的闪亮应用程序。主要目标是在Windows下方便地在医院安装。在非IT人员的安装过程中,任何需要将字符输入到黑匣子的操作都肯定会失败。
我之前的尝试使用了vagrant,但事实证明,单独安装vagrant是一个障碍。
rocker
存储库,有一个RStudio和一个Shiny,对于我自己的安装,两者都可以一起工作。但是,我想创建一个组合应用程序以便于安装。
推荐的工作流程是什么?从RStudio开始,手动添加Shiny?或者从r-base开始合并来自两个Rocker的dockerfiles代码?还是使用撰写工具?
我开发了一个可工作的单docker
我构建它的原因与@Dieter Menne提到的完全相同。它可能不适合操作系统,但它非常适合开发人员(尤其是如果团队成员都使用不同的环境。如mac、windows等)。
它在Centos 6上,因为这是环境。我在工作中使用。
这是dockerfile:
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"]
这是监督的方式。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页面上获得:智能视觉来自数据
我还为centos上的Shining server pro开发了一个工作docker(使用Shining server pro临时版,仅45天有效)。
有趣的问题,但我不确定我是否理解从同一个容器提供闪亮服务器和rdios服务器实例的优势。
目的是使两个容器共享相同的R库(例如,不需要在每个容器上单独安装一个包),还是仅仅拥有一个docker容器而不是两个?仅仅运行两个docker命令而不是一个看起来并不那么繁重,但也许我低估了这一点。
不过,共享底层库似乎是一个有效的目标,我认为目前还没有理想的解决方案。
我觉得最像docker风格的解决方案是通过您提到的容器编排/组合工具来实现这一点。这是将单独的服务(例如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容器中删除库,以代替闪亮容器上的库:
docker run --volumes-from rstudio -dP rocker/shiny
不幸的是,这破坏了网站。容器的库。为了解决这个问题,您需要将rstudio容器库装载到不同的位置,但是没有像我们已经使用的端口链接那样简单的语法。但是可以这样做,请参阅:
如何使用Docker的卷映射卷路径?
在摇杆回购中也有一个关于这个问题的开放线程。
Docker的要点通常是隔离服务,以便在不影响其他服务的情况下对其进行更新/更改。我的建议是使用docker compose。下面是一个示例docker compose yaml文件,该文件使用Jason Wilder开发的非常有用的docker gen在同一服务器的不同子域上为rstudio和Shining提供服务。下面使用的所有R docker图像均由Rocker或更直接的Rocker docker Hub提供。这些都非常可靠,因为是德克·艾德尔布特尔和卡尔·博蒂格制作的。在这个例子中,我还为RStudio提供了一些选项,例如设置用户/过程以及用户是否具有根访问权限。有关使用Rocker RStudio图像的更多说明,请访问此wiki页面:
更改以下内容:
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版本的服务并添加即可。
Shiny 是一个为 R 模型提供 Web 交互界面的应用框架,非常容易编写应用,不要求有 Web 开发技能。 Shiny 由 RStudio 公司开发,通过 CRAN 下载安装,利用R语言轻松开发交互式Web应用。 ui.R: shinyUI(bootstrapPage( selectInput(inputId = "n_breaks", label = "Number of bin
RStudio是R的集成开发环境(IDE),它包括一个控制台、支持直接执行代码的语法高亮编辑器,以及用于绘图、历史、调试和工作空间管理的工具。点击这里查看更多RStudio功能。 RStudio 有开源版和商业版,可在桌面上(Windows、Mac 和 Linux)或连接到 RStudio Server 或 RStudio Server Pro(Debian/Ubuntu、Red Hat/Ce
是否可以从Dockerfile构建映像并使用单个命令运行它 有一个命令来构建Dockerfile,还有来运行映像。 有没有这两个命令的任何组合,使它更容易构建和运行只有一个命令?
问题内容: 我给人的印象是,可以如下将环境变量设置在一行上,以最大程度地减少中间图像。 但是,运行基于此代码段的容器并调用,我看到变量没有单独分配,而是组合为单个字符串。 但是,如果我按如下所示显式设置每个变量,则可以得到预期的输出,并且在调用变量时没有错误。 问题: 是否可以将环境变量的设置合并在一行上?如果是这样,我该怎么办?这是一个好习惯吗? 问题答案: 有两种用于指定环境的格式。如果您需要
问题内容: 我正在尝试创建一个Dockerfile。我是Docker的新手。我正在创建此Dockerfile,它将在一个实例中启动Rabbitmq,ftp服务器和elasticsearch服务器。我已经创建了这样的文件: 我想知道我是否正确创建了Dockerfile。如果有人可以帮助我,那就太好了。另外,请告诉我如何继续添加Elasticsearch服务。提前致谢! 问题答案: 我应该如何创建一个
当然,这是我的错误,但我看不到它和我的理解的差距。谢谢!