Docker容器中的Java进程不会在main()的末尾退出

我有一个java jar命令,我使用Popen从python中调用它。 我很高兴我正在做这件事,而我之所以这么做是因为很多原因(它不是很好,但事实就是这样)。

当我在本地运行Java时,它工作正常(JRE 1.8),当我在本地运行调用Java的Python时,它工作正常。 当我在Docker容器中运行它时,它只是挂起 – 在process.communicate()上的python,当我做一个docker执行程序,它只是不会返回(命令的输出是完全按照我的预期)。

我发现,除非明确的System.exit(0); 在Java的最后,Java进程在Docker容器内运行时不会结束 – 它只是在所有处理完成时挂起。

为了检查这一点,我做了一个由5行组成的Hello World应用程序(System.exit我注释掉或检查这个工作或没有)

 public class Hello { public static void main(String[] args) { System.out.println("Heellllooo"); // System.exit(0); } } 

我将它捆绑到一个jar子里,放在“真正的”jar子里,然后执行。

没有system.exit()过程挂起。 有了它,干净地退出。 在这两种情况下,“Heelllloooo”被打印。

其他随机事实可能有助于诊断我用来检查的命令是这样的(python中的popen与我传入Java的参数相比复杂得多)。

 docker exec [tag] java -jar libs/Hello.jar 

如果我做:

 docker exec [tag] java -version 

它会立即返回版本信息。

我正在运行一个Mac,所以这是运行在docker机boot2docker Ubuntu虚拟机的东西。 其他人在Debian和Ubuntu机器上运行相同的docker-images完全没有任何问题。

我不相信这个问题与Python有什么关系,因为从exec运行它时(因此我没有标记python)症状出现在那里。

我的问题:为什么不主动函数返回时,java进程退出?

要清楚,我不想知道如何杀死进程(我知道该怎么做),我想知道的是为什么进程不返回。 (这似乎是一个特定的Java /docker的事情)。

不幸的是,这看起来像一个https://github.com/docker/docker/issues/18180 ,仍然(至less2015-12-18)没有解决(除了降级内核或修改应用程序代码)的情况下, 。