0

我有一个 c++ 编译的二进制文件(我们称之为 cbin),我将它添加到 docker 映像中并希望从 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" ]

入口点.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等等......

4

1 回答 1

0

我在这里缺少的一件事是您没有将 jar 复制到 docker 映像中。但我想这是发布的代码中缺少的东西,否则你会收到如下错误:

错误:无法找到或加载主类 ClassToRun

我刚刚从您的代码中创建了一个小 jar 和 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 应用程序中打印出来以查看发生了什么。

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

如果你用以下方式启动容器怎么办:

docker run -it --entrypoint bash <your-image-name>

然后在容器中运行

$ cbin

这行得通吗?如果您在这里遇到相同的错误,那么这是 Java 运行时的问题,cbin而不是 Java 运行时的问题。

于 2019-03-10T21:02:16.603 回答