3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
根據(jù)這個(gè)答案,添加-t標(biāo)志將阻止容器在后臺(tái)運(yùn)行時(shí)退出。然后,您可以使用docker exec -i -t <image> /bin/bash進(jìn)入shell提示符。
docker run -t -d <image> <command>
似乎-t選項(xiàng)沒(méi)有很好地記錄,盡管幫助說(shuō)它“分配了一個(gè)偽TTY”。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
背景
Docker容器運(yùn)行一個(gè)使其保持活動(dòng)狀態(tài)的進(jìn)程(“命令”或“入口點(diǎn)”)。只要命令繼續(xù)運(yùn)行,容器將繼續(xù)運(yùn)行。
在您的情況下,命令(/bin/bash
默認(rèn)情況下,打開(kāi)centos:latest
)立即退出(正如bash沒(méi)有連接到終端并且無(wú)法運(yùn)行時(shí))。
通常,當(dāng)您以守護(hù)進(jìn)程模式運(yùn)行容器(with -d
)時(shí),容器正在運(yùn)行某種守護(hù)進(jìn)程(如httpd
)。在這種情況下,只要httpd守護(hù)程序正在運(yùn)行,容器將保持活動(dòng)狀態(tài)。
您似乎要做的是在容器內(nèi)運(yùn)行守護(hù)程序進(jìn)程的情況下保持容器的活動(dòng)狀態(tài)。這有點(diǎn)奇怪(因?yàn)槿萜髟谀闩c它交互之前沒(méi)有做任何有用的事情,可能還有docker exec
),但在某些情況下,做這樣的事情可能是有意義的。
(你的意思是在容器內(nèi)找到一個(gè)bash提示符嗎?這很容易!docker run -it centos:latest
)
解
在容器模式下無(wú)限期地保持容器活動(dòng)的一種簡(jiǎn)單方法是sleep infinity
作為容器的命令運(yùn)行。這并不依賴于在守護(hù)進(jìn)程模式下分配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
選項(xiàng)分配“偽tty”。這會(huì)讓bash繼續(xù)無(wú)限期地運(yùn)行,因?yàn)樗J(rèn)為它連接到交互式TTY(即使你沒(méi)有通過(guò)也無(wú)法與特定的TTY交互-i
)。無(wú)論如何,這應(yīng)該也可以解決問(wèn)題:
$ docker run -t -d centos:latest
不是100%肯定是否-t
會(huì)產(chǎn)生其他奇怪的互動(dòng); 如果有,可以在下面留言。
添加回答
舉報(bào)