如何向docker容器中运行的程序发送信号?

atu*_*pal 27 linux signals docker

我有一个程序在一个具有分离模式的docker容器中运行.

那么如何向这个程序发送SIGINT等信号呢?

And*_*ndy 68

您可以使用docker kill --signal="<signal>" <container name or id>任何信号发送到给定容器的根进程.

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


Reg*_*gan 11

您可以使用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>
Run Code Online (Sandbox Code Playgroud)

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

  • 您现在可以使用`docker exec`而不是nsenter.https://docs.docker.com/reference/commandline/exec/ (8认同)

Sud*_*Dev 7

  • docker kill 用于向主容器进程发送信号,即用PID 1进行处理.
  • PID 1的任何应用都可以直接处理信号.下面的命令会杀死主要的docker进程:$ docker kill --signal="SIGTERM" container-id/name
  • 但是没有PID 1即应用程序的应用程序是后台进程:
    • 我们无法直接向docker容器中运行的任何后台进程发送单个.
    • 在这种情况下,我们需要在作为入口点运行的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"]
Run Code Online (Sandbox Code Playgroud)
  • 下面是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
    
    Run Code Online (Sandbox Code Playgroud)
  • 构建docker镜像并运行容器.
  • 现在您可以从主机重启服务: $docker kill --signal="SIGUSR1" container-id/name