为了账号安全,请及时绑定邮箱和手机立即绑定

Docker容器将在“docker run -d”后自动停止

Docker容器将在“docker run -d”后自动停止

慕后森 2019-08-15 14:13:44
Docker容器将在“docker run -d”后自动停止根据我到目前为止阅读的教程,使用“ docker run -d”将从图像启动一个容器,容器将在后台运行。这就是它的样子,我们可以看到我们已经有了容器ID。root@docker:/home/root# docker run -d centos605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d但如果我跑“ docker ps”,则没有任何回复。所以我试过“ docker ps -a”,我可以看到容器已经退出:root@docker:/home/root# docker ps -aCONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz我做错了什么?我该如何解决这个问题?
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

根据这个答案,添加-t标志将阻止容器在后台运行时退出。然后,您可以使用docker exec -i -t <image> /bin/bash进入shell提示符。


docker run -t -d <image> <command>

似乎-t选项没有很好地记录,尽管帮助说它“分配了一个伪TTY”。


查看完整回答
反对 回复 2019-08-15
?
繁星coding

TA贡献1797条经验 获得超4个赞

背景

Docker容器运行一个使其保持活动状态的进程(“命令”或“入口点”)。只要命令继续运行,容器将继续运行。

在您的情况下,命令(/bin/bash默认情况下,打开centos:latest)立即退出(正如bash没有连接到终端并且无法运行时)。

通常,当您以守护进程模式运行容器(with -d)时,容器正在运行某种守护进程(如httpd)。在这种情况下,只要httpd守护程序正在运行,容器将保持活动状态。

您似乎要做的是在容器内运行守护程序进程的情况下保持容器的活动状态。这有点奇怪(因为容器在你与它交互之前没有做任何有用的事情,可能还有docker exec),但在某些情况下,做这样的事情可能是有意义的。

(你的意思是在容器内找到一个bash提示符吗?这很容易!docker run -it centos:latest

在容器模式下无限期地保持容器活动的一种简单方法是sleep infinity作为容器的命令运行。这并不依赖于在守护进程模式下分配TTY等奇怪的事情。虽然它依赖于做一些奇怪的事情,比如使用sleep你的主要命令。

$ docker run -d centos:latest sleep infinity$ docker psCONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMESd651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

替代方案

如cjsimon所示,该-t选项分配“伪tty”。这会让bash继续无限期地运行,因为它认为它连接到交互式TTY(即使你没有通过也无法与特定的TTY交互-i)。无论如何,这应该也可以解决问题:

$ docker run -t -d centos:latest

不是100%肯定是否-t会产生其他奇怪的互动; 如果有,可以在下面留言。


查看完整回答
反对 回复 2019-08-15
  • 3 回答
  • 0 关注
  • 12500 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信