Docker:如何从一个正在运行的容器发送信号到另一个容器?

时间:2015-06-11 08:34:50

标签: docker signals

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

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

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

send_signal.sh

docker exec docker_with_python bash send_signal.sh

之前,我从Docker主机执行了send_signal.sh:

docker kill --signal="SIGUSR1 docker_with_python

或者只是那样:

{{1}}

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

提前致谢

3 个答案:

答案 0 :(得分:5)

要实现此目的,您需要将Docker套接字从主机安装到您希望从中发送信号的容器中。例如,请参阅this post以获取解释和详细信息。

答案 1 :(得分:5)

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

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

以前,在我的 docker-compose.yml 中,我分享了一些内容:

exemple1 hostname: exemple_1 volumes: - /var/run/docker.sock:/tmp/docker.sock

答案 2 :(得分:1)

您可以通过覆盖HTTPConnection

的套接字在python中执行此操作
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 socket:-v /var/run/docker.sock:/tmp/docker.sock并将代码更改为指向右侧套接字。