Java exec в докере не находит двоичный файл - PullRequest
0 голосов
/ 10 марта 2019

У меня есть скомпилированный двоичный файл c ++ (давайте назовем его cbin), который я добавил в образ докера и хочу выполнить форму 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 found или IOException: no such file or directory error=2 и т. Д. *

1 Ответ

0 голосов
/ 11 марта 2019

Одна вещь, которую я здесь упускаю, это то, что вы не копируете банку в образ докера. Но я полагаю, что в опубликованном коде чего-то не хватает, иначе вы получите сообщение об ошибке:

Ошибка: не удалось найти или загрузить основной класс 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-приложения, чтобы увидеть, что происходит.

Вы уверены, что сообщения об ошибках, которые вы видите, поступают от вызова Java Runtime.getRuntime().exec("cbin")? А не из самого бинарника?

Что если вы начнете контейнер с:

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

и затем в контейнере просто запустите

$ cbin

Это работает? Если вы получаете те же ошибки здесь, то это проблема cbin, а не времени выполнения Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...