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會產生其他奇怪的互動; 如果有,可以在下面留言。
添加回答
舉報
