【问题标题】:Docker container exit(0) when using docker run command, but works with docker start command使用 docker run 命令时 Docker 容器退出(0),但与 docker start 命令一起使用
【发布时间】: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 7
INFO success: myguiapp entered RUNNING state
INFO: 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


【解决方案1】:

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

docker run -t --name testcontainer testimage

当您第二次执行docker start 时,它会以某种方式分配伪 tty 并且进程继续运行。我自己试过了。不过,我在 Docker 文档中的任何地方都找不到此信息。

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

docker run -t -i --name testcontainer testimage

【讨论】:

  • 我还会添加 `-i' 用于交互,用于 GUI 应用程序
  • GUI 是交互式的,但似乎不需要 -i。话虽如此,我已经尝试了 -it 以及每个标志单独进行,结果没有变化。
  • @CommanderCody 你能发布你的 Dockerfile 吗?以及什么类型的 GUI 应用程序?什么语言?什么图书馆?
  • 我不能,因为无论如何您都无权获取安装文件(这是一个工作项目)。只知道它是一个基于 Java 的大型应用程序。
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多