在docker容器内我试图使用LibreOffice将XLSX文件转换为PDF.相关命令在命令行上工作但在从R调用时失败并显示“Application Error”.我使用这个Dockerfile添加一些(根据我的经验任意)XLSX文件:
FROM rocker/r-ver:3.4.3
RUN apt-get update \
&& apt-get install --yes --no-install-recommends \
default-jre-headless libreoffice-calc \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& echo /usr/lib/libreoffice/program > /etc/ld.so.conf.d/libreoffice.conf \
&& ldconfig
COPY foo.xlsx /tmp
(ldconfig的技巧来自于
shared library issue with the system function in R.)
在命令行上,我可以将XLSX文件转换为PDF:
root@b395caeba33b:/# loffice --headless --convert-to pdf /tmp/foo.xlsx
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export
但是,这从R失败:
> system("loffice --version")
LibreOffice 5.2.7.2 20m0(Build:2)
> system("loffice --headless --convert-to pdf /tmp/foo.xlsx")
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export
Application Error
如果我将基本图像从rocker / r-ver:3.4.3更改为使用R 3.4.4和Debian testing / sid的rocker / r-base,结果只会略有变化:
> system("loffice --version")
LibreOffice 6.0.2.1.0 00m0(Build:1)
> system("loffice --headless --convert-to pdf /tmp/foo.xlsx")
Application Error
最佳答案
我找到了一个解决方法,但我仍然对正确的解释感兴趣.这是我发现的:
原文链接:https://www.f2er.com/docker/436818.html>使用选项–security-opt seccomp启动docker容器:unconfined并安装strace.
>在R电话中
system("strace -f -o R.trace loffice --headless --convert-to pdf /tmp/foo.xlsx")
>生成的跟踪文件显示加载libsal_textenclo.so时出错.奇怪的是它在/usr/lib / x86_64-linux-gnu中搜索库,即使ldconfig知道在哪里找到它:
root@1519f52c05e0:/# grep libsal R.trace
257 open("/usr/lib/x86_64-linux-gnu/libsal_textenclo.so",O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
root@1519f52c05e0:/# ldconfig -p | grep libsal
libsal_textenclo.so (libc6,x86-64) => /usr/lib/libreoffice/program/libsal_textenclo.so
>将LD_LIBRARY_PATH设置为包含/usr/lib / libreoffice / program并不能解决问题.
root@4a235dfa08e3:~# export LD_LIBRARY_PATH=/usr/lib/libreoffice/program
root@4a235dfa08e3:~# Rscript -e 'system("loffice --headless --convert-to pdf /tmp/foo.xlsx")'
Application Error
>我当前的解决方法是在R会话中设置LD_LIBRARY_PATH:
> Sys.setenv(LD_LIBRARY_PATH="/usr/lib/libreoffice/program")
> system("loffice --headless --convert-to pdf /tmp/foo.xlsx")
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export
Overwriting: //foo.pdf