docker自身給我提供了兩種退出容器的方式:
- docker kill
命令執(zhí)行時(shí)會(huì)直接發(fā)出SIGKILL的系統(tǒng)信號(hào),以強(qiáng)行終止容器中程序的運(yùn)行。類(lèi)似Linux系統(tǒng)中的kill -9或者是kill -SIGKILL命令,用來(lái)發(fā)送SIGKILL信號(hào),強(qiáng)行終止進(jìn)程。
Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...]
Kill one or more running containers
Options:
-s, --signal string Signal to send to the container (default "KILL")
- docker stop
命令執(zhí)行時(shí),會(huì)先向容器中PID為1的進(jìn)程發(fā)送系統(tǒng)信號(hào)SIGTERM,然后等待容器中的應(yīng)用程序終止執(zhí)行,如果等待時(shí)間達(dá)到設(shè)定的超時(shí)時(shí)間,或者默認(rèn)的10秒,會(huì)繼續(xù)發(fā)送SIGKILL的系統(tǒng)信號(hào)強(qiáng)行kill掉進(jìn)程。
Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]
Stop one or more running containers
Options:
-t, --time int Seconds to wait for stop before killing it (default 10)
兩者區(qū)別:
不難看出兩者的區(qū)別,kill是直接強(qiáng)制kill掉進(jìn)程然后退出容器,或者直接發(fā)送其他信號(hào)然后退出,而stop是可以設(shè)置一個(gè)延遲的時(shí)間,這個(gè)時(shí)間你可以用來(lái)處理一些退出容器前的工作,顯然要想優(yōu)雅的退出容器stop肯定是不二之選。
采坑點(diǎn):
- stop 傳遞的信號(hào)只能1號(hào)進(jìn)程接收到,其他進(jìn)程接收不到。
- stop 傳遞的信號(hào)只能是SIGTERM信號(hào)。
解決辦法:
- 如果你的進(jìn)程自己能處理退出的工作,那么只需讓他變成1號(hào)進(jìn)程即可,可以使用
exec這個(gè)命令來(lái)執(zhí)行你的命令。 - 如果不是第一種情況,那么只能寫(xiě)一個(gè)腳本(shell,go等都可以)來(lái)監(jiān)聽(tīng)信號(hào),當(dāng)監(jiān)聽(tīng)到信號(hào)后做出相應(yīng)的處理。