2017-07-17 44 views
1

案例:我們有運行,需要一個bash腳本泊塢窗容器「塊」永遠的(因爲它暴露了另一個容器容積,但爲什麼我們有時需要這樣的其他原因)。我爲什麼不能CTRL-C在泊塢窗睡眠無窮大時,它會作爲PID 1

我想這可能是工作,那麼:然後

exec sleep infinity; 

的ps aux給「睡眠」爲PID 1太好了,我想,那麼它會收到我們從容器外部發送信號。例如:

docker kill -s INT container_name 

但是,這不起作用,容器繼續運行(也適用於SIGTERM)。正常擊殺的工作,但我不明白爲什麼有區別(這惹惱了我很大):

docker kill container_name 

爲什麼我不能殺「睡眠」與SIGINT/SIGTERM,當它在運行作爲PID 1我的容器?我相信,當他們在一個容器中PID 1來看,我可以殺死其他的東西(像的bash腳本)與SIGINT/SIGTERM。

+0

什麼命令啓動的容器?什麼版本的Docker?什麼主機操作系統我們可以看到'Dockerfile'嗎? –

回答

0

請問這是什麼用途? https://www.fpcomplete.com/blog/2016/10/docker-demons-pid1-orphans-zombies-signals

基本上問題是進程號1. Linux/unix內核不情願以常規方式發信號通知進程,因爲它應該是init。如果init進程死亡,系統立即發出恐慌並重新啓動。如果您的進程1沒有處理信號的信號,信號就會被丟棄。睡眠沒有處理任何信號的處理程序,但是您可以構建一個腳本來打擊腳本。

基本上你需要做的是使用EXEC形式在dockerfile,和你的睡眠無限分裂成環路,而外殼是執行命令的bash陷阱不會被觸發。這將信號發送到正在運行的進程1和捕獲它:

Dockerfile:

FROM ubuntu 
ADD foo.sh /tmp 
RUN ["/tmp/foo.sh"] 

foo.sh:

#!/bin/bash 

trap "echo signal;exit 0" SIGINT 

while : 
do 
    sleep 1 
done 

這將反應以泊塢窗殺--signal = SIGINT。

+0

感謝這個我指出了正確的方向。一些閱讀和谷歌搜索後,我也發現了這一點,這似乎是一個很好的解決方案,可能運行的泊塢窗容器時,一個好主意:https://docs.docker.com/engine/reference/run/#specify-an-init-處理 – Otto