从Java程序内部运行Docker容器

3

我尝试在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和catch块捕获错误信息时,我没有得到任何错误消息(代码中未显示)。


该进程是否会写入任何可通过输入或错误流读取的内容? - Joe C
1
你的命令是否以root权限运行?因为Docker的CLI需要这个权限... - ErikMD
是的,确实是这样,但你看不到它,因为它没有重定向到任何地方。在这里生成的容器中的服务器应该连接回创建它的Java程序,但它没有。当我在终端中运行命令或者在程序中不使用Docker容器时,它可以正常运行。 - Tom Eijkelenkamp
我这样做是为了获得root权限:https://askubuntu.com/questions/477551/how-can-i-use-docker-without-sudo - Tom Eijkelenkamp
1个回答

1

大多数编程程序通过编程方式运行命令,不涉及shell,因此无法像shell那样执行一些好用的功能,例如变量插值。特别是这对参数:

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

告诉Docker(我想)创建一个名为"$PWD"的新命名卷,并将新的空卷挂载到容器中的/app。没有任何原因会使其扩展到当前目录的名称或删除额外的引号。

我已经更改了Docker镜像,现在可以使用命令“docker run -it --rm --net=host -P server:latest”启动它。但是我仍然遇到同样的问题,我可以从终端启动它,但无法在Java程序中启动。 - Tom Eijkelenkamp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接