我正在尝试修改一个GUI应用程序,并取得了一些成功。如果我将dockerfile构建成一个映像,然后执行一个docker run --name testcontainer testimage
,则进程似乎开始了,但突然停止了。然后使用docker ps
检查容器,以确认没有容器正在运行。然后我检查docker ps -a
,可以看到它与状态代码exit(0)
一起退出。然后,如果我运行命令docker start testcontainer
,它似乎会再次启动ENTRYPOINT
命令,但这一次它能够继续并弹出GUI。
我的最佳猜测是,当我运行docker run
命令时,进程会开始,但可能会分叉到后台进程中,导致容器退出,因为前台进程已经结束。不过,这可能是远远不够的,因为您可能认为docker start
命令会导致相同的结果。我在想如何让这个过程保持在前台,但我不知道该如何去做。有什么建议吗?
更新:我编辑了Dockerfile以使用supervisord来管理GUI应用程序的启动。现在,我的docker命令将启动主管,这将启动我的GUI应用程序,而且它可以工作。关于这一点,需要注意的是,主管表明:
INFO spawned: myguiapp with pid 7
INFO success: myguiapp entered RUNNING state
INFO: exited: myguiapp (exit status 0; expected)
此时主管和容器仍在运行,这似乎表明主进程启动子进程。由于主管仍然在运行,所以我的容器一直在运行,GUI应用程序也出现了,我可以使用它。当我关闭GUI时,主管报告:
CRIT reaped unknown pid 93
主管仍在运行,导致容器无法关闭。所以我得去CTRL杀主管。我宁愿不使用主管,但如果需要的话,我希望主管在子流程结束时优雅地关闭自己。如果我能弄清楚如何让我的容器或主管跟踪主进程的子进程,那么我认为这将得到解决。
发布于 2015-08-17 12:51:10
第一个问题可能是因为您的应用程序需要一个tty,而不是分配一个pseudo tty
。尝试像这样运行您的容器:
docker run -t --name testcontainer testimage
当您第二次执行docker start
时,它会以某种方式分配伪tty,并且进程将继续运行。我自己试过的。不过,我在码头的任何地方都找不到这个信息。
此外,如果您的UI是交互式的,您可能希望:
docker run -t -i --name testcontainer testimage
https://stackoverflow.com/questions/32058215
复制相似问题