如何在Docker容器中运行R Shiny App

时间:2019-08-08 22:51:20

标签: r docker shiny dockerfile golem

我为R Shiny App构建了一个Docker映像,并在Windows 10 Home上使用Docker Toolbox运行了相应的容器。尝试使用Web浏览器打开该应用程序时,仅显示索引。我不知道为什么该应用程序没有执行。

日志显示以下内容:

*** warning - no files are being watched ***
[2019-08-12T15:34:42.688] [INFO] shiny-server - Shiny Server v1.5.12.1 (Node.js v10.15.3)
[2019-08-12T15:34:42.704] [INFO] shiny-server - Using config file "/etc/shiny-server/shiny-server.conf"
[2019-08-12T15:34:43.100] [INFO] shiny-server - Starting listener on http://[::]:3838

我已经通过执行以下命令来指定应用程序主机到容器的路径,该路径引用了Docker集线器映像:

docker run --rm -p 3838:3838 -v /C/Docker/App/:/srv/shinyserver/ -v /C/Docker/shinylog:/var/log/shiny-server/  didsh123/ps_app:heatmap

我的Docker文件如下所示:

# get shiny serves plus tidyverse packages image
FROM rocker/shiny-verse:latest

# system libraries of general use
RUN apt-get update && apt-get install -y \
    sudo \
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libcairo2-dev \
    libxt-dev \
    libssl-dev \
    libssh2-1-dev

##Install R packages that are required--> were already succesfull
RUN R -e "install.packages(c('shinydashboard','shiny', 'plotly', 'dplyr', 'magrittr'))"

#Heatmap related packages
RUN R -e "install.packages('gpclib', type='source')"
RUN R -e "install.packages('rgeos', type='source')"
RUN R -e "install.packages('rgdal', type='source')"

# copy app to image
COPY ./App /srv/shiny-server/App

# add .conf file to image/container to preserve log file
COPY ./shiny-server.conf  /etc/shiny-server/shiny-server.conf


##When run image and create a container, this container will listen on port 3838
EXPOSE 3838

###Avoiding running as root --> run container as user instead
# allow permission
RUN sudo chown -R shiny:shiny /srv/shiny-server
# execute in the following as user --> imortant to give permission before that step
USER shiny

##run app
CMD ["/usr/bin/shiny-server.sh"]

因此,当我在浏览器中处理docker ip和评估的端口时,该应用程序应在此处运行,但仅显示索引。我使用以下行:

http://192.168.99.100:3838/App/

我很高兴收到任何提示或建议。我是Docker的新手,所以我也乐于提供详细的说明。

2 个答案:

答案 0 :(得分:3)

要在docker上使用Shiny,建议您使用golem软件包。 golem提供了构建闪亮应用程序的框架。如果您有根据其框架开发的应用程序,则功能golem::add_dockerfile()可用于自动创建dockerfile。

如果您对框架不感兴趣,仍然可以查看the source for add_dockerfile(),以了解他们如何管理部署。他们的策略是将shiny::runApp()与port参数一起使用。因此,在这种情况下,shiny-server不是必需的。

golem中的Dockerfile大致如下所示

FROM rocker/tidyverse:3.6.1
RUN R -e 'install.packages("remotes")'
RUN R -e 'remotes::install_github("r-lib/remotes", ref = "97bbf81")'
RUN R -e 'remotes::install_cran("shiny")'
RUN R -e 'remotes::install_cran("golem")'
COPY app.R /app.R
EXPOSE 3838
CMD R -e "options('shiny.port'=3838,shiny.host='0.0.0.0'); shiny::runApp('app.R')"

答案 1 :(得分:0)

检查日志中是否有任何有用的信息?然后执行到容器中,以验证是否将App内容复制到正确的位置。

因为/ App内容的复制方式看起来不正确

在构建阶段将/App的内容复制到映像中的/srv/shiny-server/App中,并且您在运行容器时尝试使用-v选项覆盖/srv/shiny-server的内容。

好像在运行时,被复制的App数据被覆盖。

尝试不使用-v /C/Docker/App/:/srv/shinyserver/或使用-v /C/Docker/App/:/srv/shinyserver/App/

docker run --rm -p 3838:3838 -v /C/Docker/shinylog:/var/log/shiny-server/ didsh123/ps_app:heatmap