在 Docker 上运行"ProcessBuilder.start"失败



在Docker容器中安装libreoffice包。

我正试图将一个JAVA应用程序从Excel转换为PDF文件,但出现了一个错误。(容器正在Google Cloud Run上运行。(

Dockerfile在下面。

FROM maven:3.8-jdk-11
RUN apt-get -y update
RUN apt-get -y install libreoffice
RUN mvn package
FROM adoptopenjdk/openjdk11:alpine-jre
CMD ["java", "-jar", "/app.jar"]

容器中运行的java代码如下。

ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "soffice --headless -convert-to pdf --outdir '/out' '/out/file.xlsx'");
Process process = builder.start();

输出的错误消息如下所示。

line 1: soffice:not found

在Dockerfile中安装包后,当我执行which命令时,usr/bin/libreoffice已经存在,所以我认为路径是正确的。(我可能错了(

我想可能有一些信息丢失了,但我不太确定,因为我是Docker的新手。

如有任何帮助,我们将不胜感激。

错误表明/bin/sh不知道二进制soffice在哪里;soffice";二进制文件必须在/bin/sh的PATH上。启动一个shell并使用which soffice进行检查,在您的代码工作之前,您可能能够修复您的shell配置文件,以包括soffice的正确PATH目录:

ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "soffice --headless -convert-to pdf --outdir '/out' '/out/file.xlsx'");

但是,如果你知道soffice二进制文件的完全限定路径,你应该能够消除子进程shell的使用,并将命令行参数分开:

String soffice = "/full/path/to/soffice"; // eg /usr/lib/libreoffice/program/soffice.bin
// Check with:
System.out.println(soffice +" exists: "+new File(soffice).exists());
ProcessBuilder builder = new ProcessBuilder(soffice, "--headless", "-convert-to pdf", "--outdir", "/out", "/out/file.xlsx");

如果";soffice";在提供给JVM的PATH中,然后在没有子进程shell的情况下启动,路径应该可以工作。在启动Java应用程序之前,您可以检查which soffice,看看这是否可行:

String soffice = "soffice"; 
ProcessBuilder builder = new ProcessBuilder(soffice, "--headless", "-convert-to pdf", "--outdir", "/out", "/out/file.xlsx");

最新更新