如何在Docker容器中运行R Shining应用程序

如何在Docker容器中运行R Shining应用程序,r,docker,shiny,dockerfile,golem,R,Docker,Shiny,Dockerfile,Golem,我为一个Docker Shining应用程序构建了一个Docker映像,并在Windows10Home上使用Docker工具箱运行了相应的容器。尝试使用“我的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

我为一个Docker Shining应用程序构建了一个Docker映像,并在Windows10Home上使用Docker工具箱运行了相应的容器。尝试使用“我的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 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的新手,所以我也很乐意得到详细的解释。

查看日志以了解有用的信息?并执行到容器中,以验证应用程序内容是否复制到正确的位置

因为复制/应用程序内容的方式看起来不正确

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

看起来在运行时复制的应用程序数据正在被覆盖

尝试不使用
-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/shinny server/didsh123/ps\u app:heatmap

要在docker中使用shinny,我建议您使用该软件包。golem提供了一个构建闪亮应用程序的框架。如果您有一个根据其框架开发的应用程序,可以使用函数
golem::add_dockerfile()
自动创建dockerfile

如果您对框架不感兴趣,您仍然可以看看他们是如何管理部署的。他们的策略是对port参数使用
shinny::runApp()
。因此,在这种情况下,
闪亮服务器

傀儡中的Dockerfile大致如下所示

来自摇臂/三角帆的
:3.6.1
运行R-e'install.packages(“闪亮”)'
复制app.R/app.R
暴露3838
CMD R-e'shinny::runApp(“app.R”,port=3838,host=“0.0.0.0”)'
这将使应用程序在端口
3838
上可用。当然,您必须安装任何其他R软件包和系统依赖项

附加提示
  • 为了增加再现性,我建议您使用
    remotes::install\u version()
    而不是
    install.packages()
  • 如果您要部署具有类似依赖关系的多个应用程序(例如
    shinydashboard
    ),那么编写自己的基本映像来代替
    rocker/tidyverse:3.6.1
    ,是很有意义的。这样,您的构建将更快

感谢您提供有关/App内容的建议。我把这个修好了。但由于我是Docker的新手,我还没有处理日志文件。我将执行log命令时收到的行附加到上面的问题。你也能看看吗?此外,我按照您的建议执行了容器,它工作了。@Heysa12很高兴知道它工作了。根据日志,应用程序正在使用配置文件
/etc/shinny server/shinny server.conf
,但当您复制
时,会复制/shinny-server.conf.txt/etc/shinny server/
-
.txt
文件。这意味着您的应用程序正在使用默认配置,而不是您复制到映像中的文件。您还可以将
用户appuser
添加到dockerfile,以减轻日志中的安全风险警告。Ref:容器不再以root用户身份运行,而是以用户身份运行(请参阅相关编辑)。所以这是固定的,但仍然是相同的问题。它可能与配置文件有关吗?docker文件中的正确命令是什么,可以从github存储库复制我自己的配置文件,而不是您提到的默认配置文件?@Heysa12-使用此
copy./shinny-server.conf/etc/shinny-server/
。您正在尝试将.txt文件复制到/etc/shinny服务器中-请检查本地目录中的文件扩展名。