Docker中的Java Exec找不到二进制

Java exec in docker not finding binary

本文关键字:找不到 二进制 Exec Java 中的 Docker      更新时间:2023-10-16

我有一个c 编译的二进制(我们称为cbin),我添加到docker映像并想要执行form java。

我尝试了Runtime.exec的几乎所有参数:

Runtime.getRuntime().exec(new String[]{"/bin/sh", "cbin"});
Runtime.getRuntime().exec(new String[]{"bash", "-c", "cbin"});
Runtime.getRuntime().exec("cbin");

什么都没有用!

我的dockerfile:

FROM openjdk:8-jre-alpine
VOLUME ["/root/.config"]
RUN apk --no-cache add bash
ENV PATH="/app:$PATH"
WORKDIR /app
COPY cbin cbin
COPY ./entrypoint.sh /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh" ]

entrypoint.sh:

#!/usr/bin/env sh
set -e
JAVA_ARGS="-cp jar.jar ClassToRun"
chmod +x cbin
java ${JAVA_ARGS}

我尝试运行:

Runtime.getRuntime().exec("ls");

我在那里看到了该文件,但是我不断获得command not foundIOException: no such file or directory error=2等...

我缺少的一件事是,您不将jar复制到docker映像中。但是我想这是已发布的代码中缺少的东西,否则您会遇到一个错误:

错误:找不到或加载主类Classtorun

我刚刚从您的代码中创建了一个小罐子和docker映像,它仅处理:

    Process process = Runtime.getRuntime().exec("cbin");
    new Thread(() -> {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }).run();
    process.waitFor();

我刚刚添加了代码以从二进制中获取stderr并从Java应用程序中打印出来以查看正在发生的事情。

您确定看到的错误消息来自Java Runtime.getRuntime().exec("cbin")调用吗?而不是来自二进制本身?

如果您使用:

启动容器怎么办
docker run -it --entrypoint bash <your-image-name>

,然后在容器中运行

$ cbin

这个有效吗?如果您在这里遇到相同的错误,则是cbin的问题,而不是Java运行时的问题。

相关文章: