2014-09-05 1 views

回答

9

您可以使用nsenter進入您的容器空間併發送信號。

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>) 
nsenter --target $PID --mount --uts --ipc --net --pid kill -SIGINT <PID of your program inside your container> 

更多信息:http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/

+5

您現在可以使用'docker exec'代替nsenter。 https://docs.docker.com/reference/commandline/exec/ – Andy 2015-07-20 19:07:17

41

您可以使用docker kill --signal="<signal>" <container name or id>任何信號發送到指定容器的根進程。

參見http://docs.docker.com/engine/reference/commandline/kill/

+0

是的,但我想要發送信號的程序是在容器中運行的程序,但不一定是根進程。例如在Docker中運行bash,然後在docker中的bash中運行其他命令。感謝您的回答。 – atupal 2014-09-06 08:14:50

3
  • docker kill用於發送信號到主容器處理過程即與PID 1.
  • 任何應用程序與PID 1可直接處理信號。下面的命令殺掉主要泊塢窗過程:$ docker kill --signal="SIGTERM" container-id/name
  • 但應用程序,它不具有PID 1即應用程序是後臺進程:
    • 我們不能發送單直接泊塢窗容器中運行任何後臺進程。
    • 在這種情況下,我們需要在作爲入口點運行的shell腳本中捕獲和處理用戶定義的信號。
  • 讓我們有以下Dockerfile。 (更新它根據應用)

FROM centos:6.7 
# Install/Deploye the service below. 

# Copy the shell script. 
COPY entrypoint.sh /home 
EXPOSE 8080 
ENTRYPOINT ["/home/entrypoint.sh"] 

  • 以下爲entrypoint.sh。 (根據應用程序更新它)。假設我們想重新啓動一個init.d服務。

    #start the service 
    /etc/init.d/<servicename> start 
    pid="$!" 
    
    # SIGUSR1- Single handler 
    my_handler() { 
        /etc/init.d/<servicename> restart 
    } 
    
    # Trap and handle the user defind singnal. 
    trap 'my_handler' SIGUSR1 
    
    # wait forever(Alive container.) 
    while true 
    do 
        tail -f /dev/null & wait ${!} 
    done 
    
  • 構建docker鏡像並運行容器。
  • 現在你可以重新從主機服務:$docker kill --signal="SIGUSR1" container-id/name
0

我設法在泊塢窗容器由信號我想發送到進程(程序):

  1. 獲取的的ID集裝箱 - docker ps | grep的yourProgramName - 使用泊塢窗EXEC -IT 4b6425cf4261慶典
  2. 列出所有正在運行與PS -A過程
  3. 找到PID 4b6425cf4261
  4. 登錄到容器中 - 對我來說,它看起來像這樣過程中要發送一個SIGINT到
  5. 將信號發送到它:殺-SIGINT PID(例如:殺-SIGINT 15)
相關問題