使用Docker exec运行java命令会失败,并显示“no such file or directory”

我在一个Scala项目中使用Docker Java客户程序来编程创build映像并启动容器,然后执行一个.jar文件中的Java类,该文件在一个附加卷中可用。

// 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文件在创build容器时绑定的卷中可用。

我试着运行不同版本的命令,例如简单的java命令(没有bash -c),我也尝试了不同的位置,比如我的本地PC上的文件位置或Docker运行的机器上的path,结果相同可悲的。

  // 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"} 

如果我复制上述命令,附加到正在运行的容器并运行它,然后它执行完美,这是我迷失在这个问题上的主要原因。 我的理解是,卷在初始执行时应该是可用的,当我连接到容器时它肯定是可用的。

直接运行java会认为它在$PATH ,这通常不是一个安全的假设。

更安全的方法是使用完全限定的path,例如/usr/bin/java