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

10
我正在使用Docker,想知道:是否可以从一个正在运行的容器向另一个正在运行的容器发送信号?
更具体地说,我想向Python程序发送SIGUSR1信号。
我已经编写了一个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 ```
但现在,我想向一个正在运行的容器发送信号到另一个正在运行的容器。那么,我怎样才能从另一个正在运行的容器执行此命令呢?或者是否有其他方式发送信号?
提前感谢。
4个回答

9
这是我使用的代码。它可能会对其他人有所帮助:
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

谢谢!我使用了这个Node.js封装来进行相同的API调用。 - styfle
7
请注意,通过与容器共享Docker套接字,您赋予该容器完全控制Docker守护程序的能力,包括例如在容器内启动挂载主机根目录的新容器。这意味着,如果有人成功入侵了您的容器,实际上他们将拥有您的主机。另请参阅https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface。 - SvdB

6
为实现此目的,您需要将主机机器上的Docker套接字(socket)挂载到您希望发送信号的容器中。请参阅例如此文章以了解详细解释和细节。

谢谢,我看过这篇文章。我本以为还有其他解决方案,但无论如何,我会使用这个。 - pierrelb

1

在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'])

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套接字:-v /var/run/docker.sock:/tmp/docker.sock并更改代码以指向正确的套接字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接