【问题标题】:Docker: how to send a signal from one running container to another one?Docker:如何将信号从一个正在运行的容器发送到另一个容器?
【发布时间】:2015-06-11 08:34:49
【问题描述】:

我正在使用 docker,我想知道:是否可以从正在运行的容器向另一个正在运行的容器发送信号?

更准确地说,我想将 SIGUSR1 发送到 python 程序。

我已经制作了一个 bash 脚本来获取我的 python 进程的 pid 并发送信号:

send_signal.sh

#!/bin/bash py_pid=$(pidof -s python my_programme.py kill -SIGUSR1 $py_pid

之前,我是这样从 Docker 主机执行 send_signal.sh 的:

docker exec docker_with_python bash send_signal.sh

或者就这样:

docker kill --signal="SIGUSR1 docker_with_python

但是现在,我想将信号发送到正在运行的容器到另一个容器。那么,我怎么能从另一个正在运行的容器中执行这个命令。还是有其他发送信号的方式?

提前致谢

【问题讨论】:

    标签: docker signals


    【解决方案1】:

    这是我使用的代码。它可以帮助其他人:

    echo -e "POST /containers/<docker_id>/kill?signal=SIGUSR1 HTTP/1.0\r\n" | nc -U /tmp/docker.sock
    

    以前,在我的 docker-compose.yml 中,我共享了卷:

    example1:
       hostname: example_1
       volumes:
         - /var/run/docker.sock:/tmp/docker.sock
    

    【讨论】:

    • 谢谢!我使用this node.js wrapper 进行相同的 API 调用。
    • 请注意,通过与容器共享 Docker 套接字,您可以让容器完全控制 Docker 守护进程,包括例如启动一个新容器,并将主机的根目录安装在容器内。这意味着如果有人设法破坏您的容器,他们实际上也将拥有您的主机。另见docs.docker.com/engine/security/security/…
    【解决方案2】:

    要完成此操作,您需要将 Docker 套接字从主机安装到您希望从中发送信号的容器中。例如,请参阅 this post 以了解说明和详细信息。

    【讨论】:

    • 谢谢,我看过这篇文章。我认为还有其他解决方案,但无论如何,我会使用这个。
    【解决方案3】:

    您可以在 python 中通过覆盖HTTPConnection 的套接字来做到这一点

    import socket
    from http.client import HTTPConnection
    
    f = '/var/run/docker.sock' # Or wherever you've mounted it to in the container
    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    s.connect(f)
    
    conn = HTTPConnection('notused')
    conn.sock = s
    conn.request('POST', '/containers/<docker_id>/kill?signal=SIGHUP')
    resp = conn.getresponse()
    
    print(resp.status)
    print(resp.headers)
    print(resp.read())
    

    优点是您可以检查状态是否成功(204)。如果状态指示错误,则响应正文将有错误消息。

    如已接受的答案所示,如果您在容器中执行此操作,则需要安装 docker 套接字:-v /var/run/docker.sock:/tmp/docker.sock 并更改代码以指向正确的套接字。

    【讨论】:

      【解决方案4】:

      在 Python 代码库中,可以考虑使用 Docker SDK for Python 向从另一个容器运行到容器中的进程发送信号。

      from docker import DockerClient
      
      client = DockerClient(base_url='unix:///tmp/docker.sock')
      container = client.containers.get('<container name goes here>')
      container.exec_run(['kill', '-SIGUSR1', '1'])
      

      【讨论】:

        猜你喜欢
        • 2023-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多