首页 > 解决方案 > 在 docker 中从 R 调用外部程序时出现问题

问题描述

当我尝试在 docker 容器内的闪亮应用程序中使用 webshot 时,我遇到了一些问题。取决于我如何组织闪亮的应用程序,有时它运行良好,有时却不行。

我创建了一个包含 2 个函数的小 reprex(Dockerfile + R 包),使用run_app2一切正常,我可以使用run_app从 dygraph 获得一个 png 文件,对phantomjs的调用在一开始就卡住了。什么也没发生

webshot启动这种指令(使用callr包):

/usr/local/bin/phantomjs --ignore-ssl-errors=true /usr/local/lib/R/site-library/webshot/webshot.js [{"url":"/tmp/RtmpIObg1n/dygraph8103063cd.html","file":"/tmp/RtmpIObg1n/file84a4d60a.png","vwidth":992,"vheight":744,"delay":0.2,"zoom":1,"debug":true}]

使用run_app2,一切都很好,但是使用run_appphantomjs 无法启动!

使用容器内的unixstrace 函数我发现这个错误表明phantomjs无休止地在文件夹顶部寻找东西(一次又一次):

strace phantomjs 输出

要运行 reprex,请使用这个 Dockerfile

FROM rocker/tidyverse

RUN apt-get install -y openjdk-8-jre && R CMD javareconf
RUN apt update
RUN apt install -y htop strace nano bzip2
RUN R -e 'install.packages("remotes")'
RUN R -e 'install.packages("pacman")'
RUN R -e "pacman::p_load('webshot')"
RUN R -e 'webshot::install_phantomjs()'
RUN R -e "pacman::p_load('dygraphs')"
RUN R -e "pacman::p_load('shiny')"
RUN echo 'local({options(shiny.port = 3838, shiny.host = "0.0.0.0")})' >> /usr/local/lib/R/etc/Rprofile.site
RUN R -e 'remotes::install_github("VincentGuyader/webshotdocker")'
EXPOSE 3838
CMD R -e 'reprexsnapshot::run_app()'

然后

docker build -t reprex .

接着

 # OK
 docker run  -p 80:3838 reprex R -e 'reprexsnapshot::run_app2()'

 # not OK
 docker run  -p 80:3838 reprex R -e 'reprexsnapshot::run_app()'

提示:您可以添加-cap-add=SYS_PTRACE --security-opt seccomp=unconfined容器内的 strace

我在这个案例上花了几个小时来理解和划定问题,我真的不明白发生了什么。如果有人能和我一起研究这个案子,我将不胜感激。

标签: rdockershinyphantomjs

解决方案


推荐阅读