3 回答
TA贡献1836条经验 获得超3个赞
根据这个答案,添加-t标志将阻止容器在后台运行时退出。然后,您可以使用docker exec -i -t <image> /bin/bash进入shell提示符。
docker run -t -d <image> <command>
似乎-t选项没有很好地记录,尽管帮助说它“分配了一个伪TTY”。
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
会产生其他奇怪的互动; 如果有,可以在下面留言。
添加回答
举报