我在Scala项目中使用Docker java client以编程方式创建图像并使用卷启动容器,然后在完成所有操作时也执行.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文件在创建容器时绑定的卷中可用。
我尝试运行不同版本的命令,例如简单的java命令(没有bash -c),我也尝试了不同的位置,例如我本地PC上的文件位置或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"}
如果我复制上述命令,请附加到正在运行的容器并运行它,然后它会完美执行,这是我在此问题上丢失的主要原因。我的理解是,卷应该在初始执行时可用,当我连接到容器时它肯定可用。
答案 0 :(得分:1)
直接运行lv_ptn...
会假设它在java
中,这通常不是一个安全的假设。
更安全的方法是使用完全限定的路径,例如$PATH
。