Java Docker 容器中的进程不会在 main() 结束时退出

Java process in Docker container doesn't exit on end of main()

我有一个 java jar 命令,我使用 Popen 从 python 内部调用它。我很高兴我做对了,我这样做有很多原因(它不是很好,但它就是这样)。

当我在本地 运行 Java 时,它工作正常(JRE 1.8),当我在本地 运行 python 调用 Java ,它工作正常。当我 运行 它在 docker 容器中时,它只是挂起 - python 在 process.communicate() 上,当我执行 docker exec 时,它只是不 return(命令的输出完全符合我的预期)。

我发现,除非 Java 末尾有明确的 System.exit(0);,否则 Java 过程不会结束 运行 在 docker 容器内 - 它只是在所有处理完成时挂起。

为了检查这一点,我制作了一个包含 5 行的 Hello World 应用程序(System.exit 我注释掉或注释掉以检查它是否有效)

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

我把它打包成一个 Jar,然后把它放在 'real' jar 所在的文件夹中,然后执行。

没有 system.exit() 进程挂起。有了它,它就会干净地退出。 在这两种情况下,都会打印 'Heelllloooo'。

其他可能有助于诊断我用来检查的命令的随机事实是:(python 中的 popen 对于我传递给 Java 的参数要复杂得多) .

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

如果我这样做:

docker exec [tag] java -version

它 return 立即包含版本信息。

我正在 运行宁 Mac,所以这是 运行宁 docker-机器 boot2docker Ubuntu vm的事情。其他人 运行 在 Debian 和 Ubuntu 机器上使用相同的 docker-images 完全没有任何问题。

我不认为这个问题与 Python 有任何关系,因为当 运行 从 exec 中调用它时就会出现症状(因此我没有标记它 python) .

我的问题:为什么java进程在主函数returns时不退出?

说清楚,我不想知道如何杀死进程(我知道怎么做),我想知道的是为什么进程没有return. (这似乎是一个特定的 java / docker 事情)。

不幸的是,这看起来像 https://github.com/docker/docker/issues/18180 的情况,它仍然(至少截至 2015-12-18)尚未解决(除了降级内核或修改应用程序代码之外)。