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

问题描述 投票:0回答:5

我有一个程序在分离模式的 Docker 容器中运行。

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

linux signals docker
5个回答
106
投票

您可以使用

docker kill --signal="<signal>" <container name or id>
将任何信号发送到给定容器的根进程。

参见 https://docs.docker.com/engine/reference/commandline/kill/#send-a-custom-signal--to-a-container


14
投票

您可以使用 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/


10
投票
  • docker kill
    用于向主容器进程发送信号,即 PID 为 1 的进程。
  • 任何具有 PID 1 的应用程序都可以直接处理信号。下面的命令杀死主 docker 进程:
    $ docker kill --signal="SIGTERM" container-id/name
  • 但是没有 PID 1 的应用程序,即应用程序是后台进程:
    • 我们无法直接将 single 发送到 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"]

  • 下面是

    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

5
投票

我设法通过以下方式向 docker 容器中的进程(程序)发送我想要的信号:

  1. 获取容器的ID - docker ps | grep yourProgramName - 对我来说它看起来像这样 - 4b6425cf4261
  2. 使用 docker exec -it 4b6425cf4261 bash 登录容器
  3. 使用 ps -A
  4. 列出所有正在运行的进程
  5. 找到您想要向其发送 SIGINT 的进程的 PID
  6. 向其发送信号:kill -SIGINT PID(示例:kill -SIGINT 15)

0
投票

compose
合作时,这对我很有用:

docker compose kill -s <SIGNAL> <compose service name>

这将向容器的根进程发送指定的信号。

例如,我在容器内重新加载gunicorn WSGI服务器进程时遇到了问题。

docker compose kill -s HUP <my service name>
解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.