Process 使用Docker run命令时Docker容器退出(0),但与Docker start命令一起使用

Process 使用Docker run命令时Docker容器退出(0),但与Docker start命令一起使用,process,docker,exit,boot2docker,entry-point,Process,Docker,Exit,Boot2docker,Entry Point,我正在尝试对接一个GUI应用程序,并取得了一些成功。如果我将dockerfile构建到一个映像中,然后执行docker运行--name testcontainer testimage,则进程似乎开始了,但突然停止。然后,我用docker ps检查容器,确认没有容器在运行。然后我检查docker ps-a,可以看到它以状态代码exit(0)退出。然后,如果我运行命令docker start testcontainer,它似乎会再次启动ENTRYPOINT命令,但这一次它可以继续,GUI会弹出 我的

我正在尝试对接一个GUI应用程序,并取得了一些成功。如果我将dockerfile构建到一个映像中,然后执行
docker运行--name testcontainer testimage
,则进程似乎开始了,但突然停止。然后,我用
docker ps
检查容器,确认没有容器在运行。然后我检查
docker ps-a
,可以看到它以状态代码
exit(0)
退出。然后,如果我运行命令
docker start testcontainer
,它似乎会再次启动
ENTRYPOINT
命令,但这一次它可以继续,GUI会弹出

我的最佳猜测是,我认为当我运行
docker run
命令时,进程开始,但可能会分叉到后台进程,导致容器退出,因为前台进程已经结束。尽管这可能有点离谱,因为您可能认为
docker start
命令会产生相同的结果。我曾想过试图迫使流程保持在前台,但不知道如何做到这一点。有什么建议吗

更新:我编辑了Dockerfile以使用SupervisorOrd管理GUI应用程序的启动。现在,我的docker run命令将启动supervisor,它将启动我的GUI应用程序,并且可以正常工作。关于这一点,需要注意的是,主管显示:
生成的信息:带有pid 7的myguiapp

信息成功:myguiapp进入运行状态

信息:退出:myguiapp(退出状态0;预期)

主管和容器此时仍在运行,这似乎表明主进程启动了子进程。由于supervisor仍在运行,所以我的容器保持运行,GUI应用程序确实显示出来,我可以使用它。当我关闭GUI时,主管报告:
CRIT获得未知pid 93


主管仍在运行,导致容器未关闭。所以我必须按住CTRL-C键才能杀死主管。我不希望使用supervisor,但如果需要,我希望supervisor在子进程结束时优雅地关闭自己。如果我能找出如何让我的容器或主管跟踪主进程的子进程,那么我认为这将得到解决。

第一个问题可能是因为您的应用程序需要tty,而您没有分配
伪tty
。尝试如下方式运行容器:

docker run -t --name testcontainer testimage
当您第二次执行
docker start
时,它会以某种方式分配伪tty,进程将继续运行。我自己试过了。我在Docker文档中找不到这些信息

此外,如果您的UI是交互式的,您还需要:

docker run -t -i --name testcontainer testimage

dockerfile和start命令看起来如何?如果start命令退出,那么容器也会退出。所以从前台开始你的流程听起来是个好主意。对不起,我不明白你的意思。我的docker start命令在run命令退出后工作正常。我的ENTRYPOINT命令只是我正在对接的GUI应用程序的可执行文件的CLI路径。我还将为交互式添加“-I”,对于GUI应用程序,GUI是交互式的,但似乎不需要-I。话虽如此,我已经试过了-它和每个标志都是单独的,结果没有变化。@CommanderCody你能发布你的Dockerfile吗?以及什么类型的GUI应用程序?什么语言?什么库?我不能,因为你无论如何都无法获取安装文件(这是一个工作项目)。只需知道它是一个基于java的大型应用程序。