gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:16:50 25 4
gpt4 key购买 nike

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

我最好的猜测是,我认为当我运行 docker run 命令时,进程会开始,但可能会 fork 到后台进程,导致容器退出,因为前台进程已结束。尽管这可能很遥远,因为您会认为 docker start 命令会产生相同的结果。我正在考虑尝试强制该进程留在前台,但不知道该怎么做。有什么建议吗?

更新:我编辑了 Dockerfile 以使用supervisord 来管理 GUI 应用程序的启动。现在我的 docker run 命令将启动 Supervisor,它将启动我的 GUI 应用程序,并且它可以工作。需要注意的一些事情是主管显示:
INFO 产生:myguiapp 的 pid 7
信息成功:myguiapp 进入 RUNNING 状态
信息:已退出:myguiapp(退出状态 0;预期)
此时Supervisor和容器仍在运行,这似乎表明主进程启动了一个子进程。由于主管仍在运行,我的容器保持运行状态,并且 GUI 应用程序确实出现,我可以使用它。当我关闭 GUI 时,主管报告:
CRIT 获得未知 pid 93
Supervisor 仍在运行,导致容器不关闭。所以我必须按 CTRL-C 来杀死主管。我宁愿不使用主管,但如果需要,我希望主管在该子进程结束时优雅地关闭自己。如果我能弄清楚如何让我的容器或主管跟踪主进程的子进程,那么我认为这将得到解决。

最佳答案

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

docker run -t --name testcontainer testimage

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

此外,如果您的 UI 是交互式的,您可能会希望:

docker run -t -i --name testcontainer testimage

关于process - 使用 docker run 命令时 Docker 容器退出(0),但与 docker start 命令一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32058215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com