shiny的应用程序只有在触摸Docker容器内的ui.R后才能正常工作

我目睹了一个奇怪的现象与R Shiny演示程序(“使用空间”),我一起入侵。 它只包含一个数据表,里面填充了一些随机数据。 代码如下:

ui.R:

library(shiny) shinyUI(fluidPage( dataTableOutput("foobar") ) ) 

server.R:

 library(shiny) library(DT) source("data-generator.R") data <- randomEntries(100) # function from data-generator.R shinyServer(function(input, output) { cols <- c("First Name", "Last Name", "ID", "Disk Usage") output$foobar <- renderDataTable(expr=data, colnames=cols) }) 

使用runApp()从RStudio启动时,一切正常。

现在我想在Docker容器中运行它。 不要犹豫,指出我做错了什么,我刚刚开始使用Docker,并且正确地获得权限(或至less是工作)是相当麻烦的。

Dockerfile:

 FROM centos MAINTAINER Patrick Bucher "patrick.bucher@compa.ny" RUN ["rpm", "-Uvh", "https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm"] RUN ["yum", "-y", "install", "R", "wget", "git"] RUN ["R", "-e", "install.packages('shiny', repos='http://cran.rstudio.com/')"] RUN ["R", "-e", "install.packages('rmarkdown', repos='http://cran.rstudio.com/')"] RUN ["R", "-e", "install.packages('DT', repos='http://cran.rstudio.com/')"] RUN ["wget", "https://download3.rstudio.org/centos5.9/x86_64/shiny-server-1.5.3.838-rh5-x86_64.rpm"] RUN ["yum", "-y", "install", "--nogpgcheck", "shiny-server-1.5.3.838-rh5-x86_64.rpm"] RUN ["rm", "shiny-server-1.5.3.838-rh5-x86_64.rpm"] RUN ["yum", "clean", "all"] RUN ["mkdir", "-p", "/srv/shiny-server"] RUN ["mkdir", "-p", "/var/log/shiny-server"] RUN ["mkdir", "-p", "/var/lib/shiny-server"] RUN ["ln", "-fs", "/usr/share/zoneinfo/Europe/Zurich", "/etc/localtime"] COPY start-shiny /usr/bin/start-shiny EXPOSE 3838 

build立:

 #!/bin/sh mkdir -p apps mkdir -p logs rm -rf apps/used-space docker build -t shinysrv 

跑:

 #!/bin/sh iptables -I INPUT -p tcp -m tcp --dport 3838 -j ACCEPT DIRS[0]=/srv/shiny-server DIRS[1]=/var/log/shiny-server DIRS[2]=/var/lib/shiny-server docker run --privileged --name ssrv01 -dit -p 3838:3838 -v `pwd`/apps:${DIRS[0]} -v `pwd`/logs:${DIRS[1]} shinysrv sh for DIR in ${DIRS[@]}; do docker exec --privileged ssrv01 chown -R shiny:shiny $DIR docker exec --privileged ssrv01 chmod -R 755 $DIR done docker exec --user shiny ssrv01 start-shiny 

开始shiny:

 #!/bin/sh git clone https://github.com/patrickbucher/used-space.git /srv/shiny-server/used-space exec shiny-server 1> /tmp/shiny.out 2> /tmp/shiny.err & 

连接:

 #!/bin/sh docker exec --user shiny -it ssrv01 sh 

一切正常,服务器即将到来。 但是当我到本地主机:3838 /旧空间,我看到一个空白页。 现在来了一个有趣的部分:我只是打开shell( ./connect )并运行touch /srv/shiny-server/used-space/ui.R ,再次加载页面 – 它工作得很好。

我的感觉是这与Docker层相关,但是我不能指出什么是错误的。 有人可以吗? (我尝试过两种configuration:一次在Arch Linux主机系统上,一次在CentOS虚拟系统上,一次在Windows 10上使用VirtualBox托pipe,行为完全一样,当我touch另一个文件时,比如server.R ,没有开始工作。)

我解决了。 ui.R缺lesslibrary(DT) ,所以无法build立数据表。 ui.R可能在加载DT库的server.R之前加载。 当我在ui.R上执行touch时,服务器重新加载并重新执行,现在已经正确加载了DT库。 它现在工作!