You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:07:03