r - 如何在 Docker 容器中运行 R Shiny App
问题描述
我为 R Shiny App 构建了一个 Docker Image,并在 Windows 10 Home 上使用 Docker Toolbox 运行了相应的容器。尝试使用我的网络浏览器打开应用程序时,仅显示索引。我不知道为什么应用程序没有执行。
日志向我显示了这一点:
*** 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 hub 映像的命令指定了应用程序主机到容器的路径:
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 新手,所以我也很高兴得到详细的解释。
解决方案
要在 docker 中使用闪亮,我建议你使用golem包。golem 提供了一个构建闪亮应用程序的框架。如果您有一个根据他们的框架开发的应用程序,该功能golem::add_dockerfile()
可用于自动创建 dockerfiles。
如果您对框架不感兴趣,您仍然可以查看add_dockerfile() 的源代码以了解它们如何管理部署。他们的策略是使用shiny::runApp()
port 参数。因此,shiny-server
在这种情况下没有必要。
golem 中的 Dockerfile 大致是这样的
FROM rocker/tidyverse:3.6.1
RUN R -e 'install.packages("shiny")'
COPY app.R /app.R
EXPOSE 3838
CMD R -e 'shiny::runApp("app.R", port = 3838, host = "0.0.0.0")'
这将使应用程序在 port 上可用3838
。当然,您必须安装任何其他 R 包和系统依赖项。
其他提示
- 为了提高可重复性,我建议您使用
remotes::install_version()
而不是install.packages()
. shinydashboard
如果您要部署多个具有相似依赖关系的应用程序(例如rocker/tidyverse:3.6.1
. 这样,您的构建将更快。
推荐阅读
- tcl - 在 tcl 中复制文件名(带通配符)
- swift - Xcode 10 存档构建编译失败
- c++ - 如何将一个特征张量乘以 C++ 中另一个特征张量的标量和?
- user-interface - Microfocus Cobol 所需的 GUI ScreenIO 的替代或等效产品
- css - 如何使用 css 样式标签更改 html 背景图像?
- javascript - jQuery/JSON 内容数据加载
- mysql - 如何屏蔽mysql中的信息
- php - php exec崩溃没有输出
- javascript - Redux thunk,将其用作列表或用作对象之间的区别
- c++ - 类错误中的 C++ 模板特化