Запуск java-команды с Docker exec завершается с ошибкой "нет такого файла или каталога"

Я использую Java-клиент Docker в проекте Scala для программного создания изображений и запуска контейнеров с томом (-ами), затем, когда все это будет сделано, также выполните класс Java в файле.jar, который доступен на одном из подключенных томов.,

  // Constructing the container and getting it's ID
  val containerID = dockerClient
    .createContainerCmd(imageID)
    .withName(s"${namePrefix}_${RandomStringUtils.randomAlphanumeric(12)}")
    .withTty(true)
    .withVolumes(volume)
    .withBinds(new Bind("/home/core/docker-dependencies", new Volume("/opt/dependencies")))
    .exec()
    .getId
  // Starting the container
  dockerClient
    .startContainerCmd(containerID)
    .exec()

Команда, которую я пытаюсь выполнить:

val command = s"""bash -c "java -cp /opt/dependencies/Platforms-assembly-0.2.4.jar com.org.test.platforms.common.Endpoint param1 param2}""""

Файл JAR, указанный в команде, доступен в томе, который был связан при создании контейнера.

Я попытался запустить разные версии команды, например, как простая команда Java (без bash -c), я также попробовал другое местоположение, например, местоположение файла на моем локальном ПК или путь на машине, где работает Docker, с тем же результатом к сожалению.

  // Preparing the command for execution
  val executionID = dockerClient
    .execCreateCmd(containerID)
    .withCmd(command)
    .exec()
    .getId
  // Starting the execution
  dockerClient
    .execStartCmd(executionID)
    .withTty(true)
    .exec(new ExecStartResultCallback(System.out, System.err))
    .awaitCompletion()

Ошибка, которую я получаю:

com.github.dockerjava.api.exception.NotFoundException: {"message":"rpc error: code = 2 desc = oci runtime error: exec failed: exec: \"bash -c \\\"java -cp /opt/dependencies/Platforms-assembly-0.2.4.jar  com.org.test.platforms.common.Endpoint param1 param2\\\"\": stat bash -c \"java -cp /opt/dependencies/Platforms-assembly-0.2.4.jar  com.org.test.platforms.common.Endpoint param1 param2\": no such file or directory"}

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

1 ответ

Бег java прямо предположил бы, что это в $PATH, что обычно не является безопасным предположением.

Более безопасный подход - использовать полный путь, например, /usr/bin/java,

Другие вопросы по тегам