r - 在 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_app
phantomjs 无法启动!
使用容器内的unixstrace
函数我发现这个错误表明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
我在这个案例上花了几个小时来理解和划定问题,我真的不明白发生了什么。如果有人能和我一起研究这个案子,我将不胜感激。
解决方案
推荐阅读
- apache-nifi - 通过 Nifi 处理大文本文件返回 null
- python - 在python中调用空数组的元素
- objective-c - Objective-C:强制使用 Facebook 应用程序登录?
- swift - 整数表右对齐
- spring-security - 带有 Oauth 令牌的 spring ABAC
- c++ - STL parallel max_element 比sequential 慢,怎么写一个更好?
- c# - Microsoft.Office.Interop.Word C#
- gradle - 任务输出缓存已启用,但未配置或启用构建缓存
- c - 块的块签名,它接受一个函数指针并返回一个块
- c++ - 为什么标准容器要求 allocator_type::value_type 为元素类型?