Docker(Rocky Linux)中LibreOffice PID未找到及jodconverter调用失败问题
问题:Docker(Rocky Linux)环境下JodConverter调用LibreOffice失败
背景
我是Docker(Rocky Linux)环境新手,要在Java进程中使用JodConverter工具,更新了Dockerfile安装LibreOffice,但遇到以下问题:
Dockerfile内容
#Installing LibreOffice COPY backend/LibreOffice_6.3.5.2_Linux_x86-64_rpm /usr/local/LibreOffice_6.3.5.2_Linux_x86-64_rpm RUN cd /usr/local/LibreOffice_6.3.5.2_Linux_x86-64_rpm/RPMS/ RUN yum -y install /usr/local/LibreOffice_6.3.5.2_Linux_x86-64_rpm/RPMS/*.rpm;
命令行错误
容器内/opt目录找到libreoffice6.3,但执行Libreoffice -version提示:
bash: Libreoffice: command not found
Java进程报错
执行Java代码时出现错误:ServiceManager' started but its pid could not be found,日志如下:
OfficeProcessManager : Submitting task 'Start' and waiting... 2023-08-03 13:51:37.133 INFO 1 --- [ProcessThread-0] org.jodconverter.office.OfficeProcess : Starting process with acceptString 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1;urp;StarOffice.ServiceManager' and profileDir '/usr/local/tomcat/temp/.jodconverter_socket_host-127.0.0.1_port- 2002_tcpNoDelay-1' 2023-08-03 13:51:37.148 INFO 1 --- [ProcessThread-0] org.jodconverter.office.OfficeProcess : Started process; pid = -2 2023-08-03 13:51:37.149 ERROR 1 --- [TaskScheduler16] c.m.service.TransformationService : ERROR convertToDocx: org.jodconverter.office.OfficeException: A process with acceptString 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1;urp;StarOffice.ServiceManager' started but its pid could not be found at org.jodconverter.office.OfficeProcess.start(OfficeProcess.java:354) at org.jodconverter.office.OfficeProcessManager.doStartProcessAndConnect(OfficeProcessManager.java:100) at org.jodconverter.office.OfficeProcessManager.access$100(OfficeProcessManager.java:40) at org.jodconverter.office.OfficeProcessManager$4.call(OfficeProcessManager.java:260) at org.jodconverter.office.OfficeProcessManager$4.call(OfficeProcessManager.java:255) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) 2023-08-03 13:51:37.150 INFO 1 --- [TaskScheduler16] o.j.office.AbstractOfficeManagerPool : Stopping the office manager pool... 2023-08-03 13:51:37.152 INFO 1 --- [TaskScheduler16] o.j.office.OfficeProcessManager : Submitting task 'Stop' and waiting... 2023-08-03 13:51:37.159 INFO 1 --- [ProcessThread-0] org.jodconverter.office.OfficeProcess : Trying to forcibly terminate process: 'host=127.0.0.1,port=2002,tcpNoDelay=1'; pid: -2 2023-08-03 13:51:37.166 INFO 1 --- [ProcessThread-0] o.j.office.OfficeProcessManager : process forcibly terminated with code 127 2023-08-03 13:51:37.166 INFO 1 --- [ProcessThread-0] o.j.office.OfficeProcessManager : process exited with code 127 2023-08-03 13:51:37.174 INFO 1 --- [TaskScheduler16] o.j.office.AbstractOfficeManagerPool : Office manager stopped
Java代码
libreOfficeHome = libreoff.getValue(); File initialFile = new File(workPath + "/" + fileName); LocalOfficeManager localOfficeManager = LocalOfficeManager.builder() .install() .officeHome(libreOfficeHome) //your path to openoffice .build(); try { localOfficeManager.start(); final DocumentFormat format = DocumentFormat.builder() .from(DefaultDocumentFormatRegistry.DOCX) .build(); LocalConverter .make() .convert(new FileInputStream(initialFile)) .as(DefaultDocumentFormatRegistry.getFormatByMediaType("application/msword")) .to(new File(targetFile)) .as(format) .execute(); } catch (Exception e) { logger.error("ERROR convertToDocx: " + ExceptionUtils.getStackTrace(e)); return null; } finally { OfficeUtils.stopQuietly(localOfficeManager); }
注:使用LibreOffice 7.5版本时也出现相同错误。
解决方案
1. 修复Dockerfile的安装问题
- 问题:单独的
RUN cd命令不会影响后续RUN的工作目录,且安装后未将LibreOffice可执行文件加入系统PATH。 - 修改后的Dockerfile:
# Installing LibreOffice COPY backend/LibreOffice_6.3.5.2_Linux_x86-64_rpm /usr/local/LibreOffice_6.3.5.2_Linux_x86-64_rpm RUN cd /usr/local/LibreOffice_6.3.5.2_Linux_x86-64_rpm/RPMS/ && \ yum -y install *.rpm && \ yum clean all && \ # 创建软链接到系统可执行目录 ln -s /opt/libreoffice6.3/program/soffice /usr/bin/soffice && \ ln -s /opt/libreoffice6.3/program/libreoffice /usr/bin/libreoffice
- 说明:
- 用
&&串联命令,确保在同一shell中执行cd和安装操作 - 清理yum缓存以减小镜像体积
- 软链接到
/usr/bin,让系统能直接识别libreoffice命令
- 用
2. 补充LibreOffice运行依赖
Rocky Linux容器默认缺少LibreOffice无头运行的必要依赖,添加以下命令到Dockerfile:
RUN yum -y install \ fontconfig \ libX11 \ libXext \ libXrender \ libXrandr \ libXtst \ libXi \ cups-libs \ dbus-glib \ && yum clean all
3. 调整JodConverter配置
- 确保
libreOfficeHome设置为正确路径:6.3版本对应/opt/libreoffice6.3,7.5版本对应/opt/libreoffice7.5 - 给OfficeManager添加无头运行参数:
LocalOfficeManager localOfficeManager = LocalOfficeManager.builder() .officeHome(libreOfficeHome) .officeArgs(new String[] { "--headless", "--nologo", "--nofirststartwizard", "--norestore" }) .build();
4. 验证LibreOffice可用性
容器启动后执行以下命令,确认LibreOffice能正常运行:
libreoffice --headless --nologo --nofirststartwizard --norestore --version
内容的提问来源于stack exchange,提问作者anakin59490
相关产品推荐
相关产品推荐

