从Java程序内部运行Docker容器

时间:2018-12-20 22:56:09

标签: java docker processbuilder

我尝试从Java程序内部运行docker容器,但该docker容器无法运行。

当我执行此命令时,我将在终端中用于流程构建器,容器将启动并且一切正常。

我在Java程序中打印了工作目录,这是启动Docker容器的正确目录。

我还将命令更改为:

String[] dockerCommand = new String[] {"java", "-cp", "target/MavenAsteroidsServer-1.0-SNAPSHOT.jar", "asteroidsserver.AsteroidsServer", "1600", "1600", "127.0.1.1", "8851", "8901"};

这有效,因此在没有Docker容器的情况下运行程序即可。

这是我用来从java程序内部运行docker容器的代码:

String[] dockerCommand = new String[] {"docker", "run", "-it", "--rm", "--net=\"host\"", "-p", "8901:8901", "-v", "\"$PWD\":/app", "-w", "/app", "demo/maven:3.3-jdk-8", "java", "-cp", "target/MavenAsteroidsServer-1.0-SNAPSHOT.jar", "asteroidsserver.AsteroidsServer", "1600", "1600", "127.0.1.1", "8851", "8901"};

ProcessBuilder probuilder = new ProcessBuilder(dockerCommand);

Process process;
try {
    process = probuilder.start();
    int status = process.waitFor();
} catch (InterruptedException e) {
} catch (IOException ex) {
}

我希望容器运行,但是什么也没发生。另外,当我尝试在try and catch块中捕获它们时,我也没有收到错误消息(代码中未显示)

1 个答案:

答案 0 :(得分:1)

从程序中以编程方式运行命令的大多数方法都不涉及外壳程序,因此不执行外壳程序所做的任何出色的事情,例如变量插值。特别是这对参数:

..., "-v", "\"$PWD\":/app", ...

告诉Docker(我认为)创建一个名为"$PWD"的新命名卷(如引号,美元,P,W,D,引号),然后将新的空卷挂载在/app中容器。没有什么会导致它扩展到当前目录的名称或删除多余的引号。