构建Docker映像并指定端口

时间:2019-05-14 20:48:07

标签: r docker shiny dockerfile

我目前正在尝试构建一个大型Docker映像并运行一个闪亮的应用程序,以便最终将其部署到Unix服务器上。映像成功构建;但是,当我运行该映像时,该应用程序会运行,并且会完全忽略指定的端口。

更奇怪的是,我首先构建了一个小型测试应用程序,并且这篇SO帖子(Shiny app docker container not loading in browser)中的说明起作用了。我将测试应用程序中使用的相同样式复制到另一个Shiny应用程序中,但现在无法正常工作。

我的Docker映像的结构与ShinyProxy在其Github页面上使用的结构类似:https://github.com/openanalytics/shinyproxy-template

|-- Dockerfile
|-- Rprofile.site
|-- app_stuff
    |-- app.R
    |-- accessory files called from app.R...

我的 Dockerfile 如下:

# Install R version 3.5.1
FROM r-base:3.5.1

# system libraries of general use - I don't know if these are right ????
RUN apt-get update && apt-get install -y \
    default-jdk \
    libbz2-dev \
    zlib1g-dev \
    gfortran \
    liblzma-dev \
    libpcre3-dev \
    libreadline-dev \
    xorg-dev \
    sudo \  
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libcairo2-dev \
    libxt-dev \
    libssl-dev \
    libssh2-1-dev \
    libxml2-dev

RUN R -e "install.packages('remotes');"
RUN R -e "library(remotes); \
remotes::install_version('shiny', version='1.1.0', repos='https://cran.r-project.org/'); \
remotes::install_version('tidyverse', version='1.2.1', repos='https://cran.r-project.org/'); \
remotes::install_version('ggiraph', version='0.6.0', repos='https://cran.r-project.org/'); \
remotes::install_version('plotly', version='4.8.0', repos='https://cran.r-project.org/'); \
remotes::install_version('CausalImpact', version='1.2.3', repos='https://cran.r-project.org/'); \
remotes::install_version('reshape2', version='1.4.3', repos='https://cran.r-project.org/'); \
remotes::install_version('bsts', version='0.8.0', repos='https://cran.r-project.org/'); \
remotes::install_version('xts', version='0.10-2', repos='https://cran.r-project.org/'); \
remotes::install_version('BoomSpikeSlab', version='1.0.0', repos='https://cran.r-project.org/'); \
remotes::install_version('Boom', version='0.8', repos='https://cran.r-project.org/'); \
remotes::install_version('MASS', version='7.3-50', repos='https://cran.r-project.org/'); \
remotes::install_version('dygraphs', version='1.1.1.4', repos='https://cran.r-project.org/'); \
remotes::install_version('prophet', version='0.4', repos='https://cran.r-project.org/'); \
remotes::install_version('rlang', version='0.3.3', repos='https://cran.r-project.org/'); \
remotes::install_version('Rcpp', version='1.0.1', repos='https://cran.r-project.org/'); \
remotes::install_version('zoo', version='1.8-1', repos='https://cran.r-project.org/'); \
remotes::install_version('RJDBC', version='0.2-7.1', repos='https://cran.r-project.org/'); \
remotes::install_version('rJava', version='0.9-10', repos='https://cran.r-project.org/'); \
remotes::install_version('shinyjs', version='1.0', repos='https://cran.r-project.org/'); \
remotes::install_version('DT', version='0.5', repos='https://cran.r-project.org/'); \
remotes::install_version('shinyBS', version='0.61', repos='https://cran.r-project.org/');"

# copy the app to the image
RUN mkdir /root/app_stuff
COPY app_stuff /root/app_stuff

COPY Rprofile.site /usr/lib/R/etc/

EXPOSE 3838

CMD ["R", "-e", "shiny::runApp('/root/app_stuff')"]

我的 Rprofile.site 是:

local({
   options(shiny.port = 3838, shiny.host = "0.0.0.0")
})

使用命令构建文件后

docker build -t price_opt .

然后运行图像

docker run -it -p 3838:3838 price_opt

我希望看到有光泽的应用程序打印出来:Listening on http://0.0.0.0:3838,但它会打印出来:

Listening on http://127.0.0.1:6688

我在本地计算机上找不到哪个。

同样,最奇怪的是这种类型的设置适用于较小的闪亮应用程序。当我从上面在较小的应用程序上运行该docker run命令时,该应用程序在localhost:3838下可用。

对为什么会发生这种情况有任何想法吗?我的最后一件事是,Shiny Proxy网站上的该用户似乎遇到了类似的问题(https://support.openanalytics.eu/t/shiny-app-listening-on-wrong-host/957)。他的问题是一种错字,但在这里Shiny应用程序完全忽略了Rprofile.site和docker run命令中提供的端口号,因此它的行为似乎与此相同。

编辑-解决方案

感谢用户@Wil,通过将Dockerfile的最后一行更改为CMD ["R", "-e", "shiny::runApp('/root/app_stuff', host='0.0.0.0', port=3838)"],该应用程序能够在localhost:3838上正常启动。

1 个答案:

答案 0 :(得分:1)

端口3838是Shiny Server的默认端口,但是runApp()选择一个可用端口。看来R没有接听您的Rprofile.site,所以我只想在您对runApp()的呼叫中指定端口:

CMD ["R", "-e", "shiny::runApp('/root/app_stuff',options = list(port = '3838'))"]