加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 03:52:51 所属栏目:安全 来源:网络整理
导读:我有一个java jar命令,我正在使用Popen在python中调用它.我很高兴我做得对,而且我有很多理由为什么我这样做(它不是很好,但它就是这样). 当我在本地运行Java时,它运行正常(JRE 1.8),当我在本地运行调用Java的python时,它运行正常.当我在docker容器中运行它时,

我有一个java jar命令,我正在使用Popen在python中调用它.我很高兴我做得对,而且我有很多理由为什么我这样做(它不是很好,但它就是这样).

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

我发现除非有一个显式的System.exit(0);在Java的末尾,当在一个docker容器内运行时,Java进程不会结束 – 它只是在所有处理完成时挂起.

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

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

我把它捆绑到一个罐子里,把它放在’真正’罐子所在的文件夹中,然后执行.

没有system.exit(),进程就会挂起.随着它它干净利落.在这两种情况下,都会打印出“Heelllloooo”.

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

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

如果我做:

docker exec [tag] java -version

它会立即返回版本信息.

我正在运行Mac,所以这是在docker-machine boot2docker Ubuntu vm内部运行的.在Debian和Ubuntu机器上运行相同docker-images的其他人根本没有任何问题.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读