首页 > 解决方案 > python“升级”连接从HTTP到TCP,如何?

问题描述

我想编写一个 python 程序来在 docker 容器中执行交互式命令。SSH 进入容器是不可能的,因为我无法修改容器。我正在研究 exec API。

我可以毫无问题地发出 exec API 并获取 exec 实例 ID。但是在调用 exec start API ( https://docs.docker.com/engine/api/v1.41/#operation/ExecStart ) 时,调用会卡住:

url = "https://" + server_ip + "/docker/exec/" + id + "/start"
d = {'Detach': False, 'Tty': True}
h = {'Content-Type': 'application/json'}
r = requests.post(url, headers = h, data = json.dumps(d), verify=False)
print(r.status_code)

这是我打断时看到的内容:

    r = requests.post(url, headers = h, data = json.dumps(d), verify=False)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 119, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 697, in send
    r.content
  File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 831, in content
    self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b''
  File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 753, in generate
    for chunk in self.raw.stream(chunk_size, decode_content=True):
  File "/usr/local/lib/python2.7/dist-packages/urllib3/response.py", line 572, in stream
    for line in self.read_chunked(amt, decode_content=decode_content):
  File "/usr/local/lib/python2.7/dist-packages/urllib3/response.py", line 764, in read_chunked
    self._update_chunk_length()
  File "/usr/local/lib/python2.7/dist-packages/urllib3/response.py", line 694, in _update_chunk_length
    line = self._fp.fp.readline()
  File "/usr/lib/python2.7/socket.py", line 451, in readline
    data = self._sock.recv(self._rbufsize)
  File "/usr/lib/python2.7/ssl.py", line 754, in recv
    return self.read(buflen)
  File "/usr/lib/python2.7/ssl.py", line 641, in read

如果我设置Detach为 True,它将返回 200,但它不适用于交互式命令。

实际上,我计划执行一些额外的操作,但我也无法从 python 执行“docker exec”命令。所以我真的很想让python使用docker的API。我需要做什么才能让 python 将 REST 连接“升级”为 TCP 连接?

标签: pythondockerrestsockets

解决方案


推荐阅读