通過以下命令可以直接傳遞一個kill信號運行的容器:
docker kill -s SIGTERM containID
但是對于一些情況,比如一個python服務(wù),這個信號并不能被預(yù)期那樣地捕獲。比如通常會使用while True: sleep(1)來作為永續(xù)循環(huán)。
對于Docker來說,sleep(1)其最后的命令,kill信號只能作用于這一命令,signal并不能捕獲這個信號。
在搜索了解決方法后,看到這篇文章《通過信號解決docker啟動容器后Exited退出的問題》。里面有一些解決方案,最后作者給出一個Github項目。這個方法,本質(zhì)上是在容器中用一個.sh腳本來運行服務(wù),最后由shell來捕獲命令并在容器內(nèi)部kill掉服務(wù)。
#/bin/bash
cd /path/to/work
python flask_app.py & # 將永續(xù)服務(wù)掛到后臺
# shell 的函數(shù),用于捕獲kill信號后的回調(diào)
prog_exit()
{
# 找出服務(wù)的 pid, 并向其發(fā)送 kill 信號 15
ps -ef| grep flas_app |grep -v grep |awk '{print $2}'|xargs kill -15
}
# 捕獲信號 15, 并回調(diào)函數(shù) prog_exit
trap "prog_exit" 15
# shell 中的永續(xù)服務(wù), 在服務(wù)沒有被kill掉之前一直存在
flag=1
while [ $flag -ne 0 ];do
sleep 1;
flag=`ps -ef| grep flas_app |grep -v grep | wc -l`
done;