当使用docker run命令时,Docker容器退出(0),但使用docker start命令

我试图dockerize一个GUI应用程序,并取得了一些成功。 如果我build立一个图像的dockerfile,然后执行一个docker run --name testcontainer testimage似乎该过程开始,但突然停止。 然后用docker ps检查容器,确认没有容器正在运行。 然后我检查docker ps -a ,可以看到它退出状态码exit(0) 。 然后,如果我运行命令docker start testcontainer ,它似乎再次启动ENTRYPOINT命令,但是这次它能够继续并popupGUI。

我最好的猜测是,我认为当我运行docker run命令时,进程开始,但可能被分成后台进程,导致容器退出,因为前台进程已经结束。 虽然这可能是因为你会认为docker start命令会导致相同的结果。 我正在考虑试图强制这个过程留在前台,但不知道如何去做。 有什么build议么?

更新 :我编辑我的Dockerfile使用supervisord来pipe理GUI应用程序的开始。 现在我的docker运行命令将启动supervisor,这将启动我的GUI应用程序,它的工作原理。 有些事情要注意的是,主pipe表示:
INFO spawned: myguiapp with pid 7
INFO success: myguiapp entered RUNNING state
INFO: exited: myguiapp (exit status 0; expected)
主pipe和集装箱在这一点上还在运行,这似乎表明主stream程启动了一个subprocess。 由于主pipe仍在运行,我的容器保持不变,GUI应用程序显示出来,我可以使用它。 当我closuresGUI时,主pipe报告:
CRIT reaped unknown pid 93
主pipe仍在运行,导致集装箱不能closures。 所以我必须CTRL-C杀死主pipe。 我宁愿不使用主pipe,但是如果我需要的话,我希望主pipe在孩子过程结束时能优雅地closures自己。 如果我能弄清楚如何让我的容器或主pipe跟踪主stream程的subprocess,那我想这个问题就解决了。

第一个问题可能是因为你的应用程序需要一个tty,而你没有分配一个pseudo tty 。 尝试像这样运行你的容器:

 docker run -t --name testcontainer testimage 

当你做一个docker start的时候,第二次docker start的时候会以某种方式分配这个伪tty,这个进程将继续运行。 我自己试了一下 尽pipe在Docker文档中我找不到这个信息。

另外,如果你的UI是交互式的,你会想要:

 docker run -t -i --name testcontainer testimage