闪亮的应用程序仅在触摸 Docker 容器内的 ui.R 后才能运行
Shiny app only works after touching ui.R inside Docker container
我发现一个奇怪的现象是我一起破解的 R Shiny 演示应用程序 ("used-space")。它只包含一个数据table,填充了一些随机数据。这是代码:
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,获得正确的权限(或至少工作)非常麻烦。
Docker文件:
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
构建:
#!/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
开始闪亮:
#!/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
一切正常,服务器正在启动。但是当我转到 localhost:3838/used-space 时,我看到了一个空白页。现在是有趣的部分:我只是打开 shell (./connect
) 和 运行 touch /srv/shiny-server/used-space/ui.R
,再次加载页面——它运行得非常好。
我的感觉是这与Docker层有关,但我不能指出"wrong"是什么。有人能做到吗? (我尝试了两种配置:一次在 Arch Linux 主机系统上,一次在 CentOS 虚拟系统上,使用 VirtualBox 在 Windows 10 上托管。行为完全相同。当我 touch
另一个文件,比如说 server.R
,它没有开始工作。)
我解决了。 ui.R 缺少 library(DT)
,因此无法建立数据 table。 ui.R 可能在 server.R 之前加载,这会加载 DT 库。当我在 ui.R 上执行 touch
时,服务器重新加载并重新执行它,现在正确加载了 DT 库。现在可以使用了!
我发现一个奇怪的现象是我一起破解的 R Shiny 演示应用程序 ("used-space")。它只包含一个数据table,填充了一些随机数据。这是代码:
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()
.
现在我想 运行 它在 Docker 容器中。不要犹豫,指出我做错的地方,我刚开始使用 Docker,获得正确的权限(或至少工作)非常麻烦。
Docker文件:
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
构建:
#!/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
开始闪亮:
#!/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
一切正常,服务器正在启动。但是当我转到 localhost:3838/used-space 时,我看到了一个空白页。现在是有趣的部分:我只是打开 shell (./connect
) 和 运行 touch /srv/shiny-server/used-space/ui.R
,再次加载页面——它运行得非常好。
我的感觉是这与Docker层有关,但我不能指出"wrong"是什么。有人能做到吗? (我尝试了两种配置:一次在 Arch Linux 主机系统上,一次在 CentOS 虚拟系统上,使用 VirtualBox 在 Windows 10 上托管。行为完全相同。当我 touch
另一个文件,比如说 server.R
,它没有开始工作。)
我解决了。 ui.R 缺少 library(DT)
,因此无法建立数据 table。 ui.R 可能在 server.R 之前加载,这会加载 DT 库。当我在 ui.R 上执行 touch
时,服务器重新加载并重新执行它,现在正确加载了 DT 库。现在可以使用了!