2014-09-05 82 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)
相关问题