【发布时间】:2015-08-17 19:29:24
【问题描述】:
我正在尝试对一个 GUI 应用程序进行 dockerize 并取得了一些成功。如果我将 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 run 命令将启动 supervisor,它将启动我的 GUI 应用程序,并且它可以工作。需要注意的是主管显示:INFO spawned: myguiapp with pid 7INFO success: myguiapp entered RUNNING stateINFO: exited: myguiapp (exit status 0; expected)
此时Supervisor和容器仍在运行,这似乎表明主进程启动了一个子进程。由于主管仍在运行,因此我的容器保持运行,并且 GUI 应用程序确实出现了,我可以使用它。当我关闭 GUI 时,主管报告:CRIT reaped unknown pid 93
Supervisor 仍在运行,导致容器未关闭。所以我必须 CTRL-C 来杀死主管。我宁愿不使用主管,但如果需要,我希望主管在该子进程结束时优雅地关闭自己。如果我能弄清楚如何让我的容器或主管跟踪主进程的子进程,那么我认为这将得到解决。
【问题讨论】:
-
你的 dockerfile 和 start 命令是什么样子的?如果您的启动命令退出,那么您的容器也会退出。所以在前台开始你的进程听起来是个好主意。
-
对不起,我不明白你的意思。 run 命令退出后,我的 docker start 命令可以正常工作。我的 ENTRYPOINT 命令只是我正在 dockerizing 的 GUI 应用程序的可执行文件的 CLI 路径。
标签: process docker exit boot2docker entry-point