在容器内创建过程并与之进行通信

时间:2018-09-21 07:12:19

标签: python docker

我正在尝试使用python在现有容器内启动进程并与之通信。

我所拥有的:

import docker
import os    
client = docker.APIClient()
buf = b"ls"
exec_setup = client.exec_create(container="some-tag", cmd="/bin/bash", stdin=True, tty=True)
socket = client.exec_start(exec_id = exec_setup["Id"], socket=True)
written = os.write(socket.fileno(), buf)
nxt = os.read(socket.fileno(), 1024)
print(nxt)

但是当我运行它时,出现BlockingIOError:[Errno 11]资源暂时不可用

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

尝试attach_socket并将其设置为非阻止模式。

params (这是您要修改的带有参数的字典)。

sock = client.attach_socket(cont, params=params)
sock._sock.setblocking(False)

在无限循环中使用select来从套接字写入/读取后。

    buff = b''
    while True:
        read, write, _ = select.select([sock], [sock], [], 1)
        if read:
            try:
               data = socket_read(sock)
            except Exception:
               break
            if data is None:
               break
            stream_data += data

        if write and stdin:
            try:
               written = socket_write(sock, stdin)
            except Exception:
               break
            stdin = stdin[written:]

            if not stdin:
               sock._sock.shutdown(socket.SHUT_WR)

socket_read / socket_write这是os.read/os.write的功能

相关问题