python - 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 连接?
解决方案
推荐阅读
- amazon-web-services - 按 STS 令牌年龄限制 S3 存储桶访问?
- sql - PowerShell 创建存储过程的备份会导致一个空白文件
- mysql - 'ERROR 1030 (HY000): 在 XAMPP 上执行 MySQL 命令时出现错误 176“读取错误校验和的页面”来自存储引擎 Aria'
- spring-boot - 使用 `publishToMavenLocal` 构建可以发布到 maven 本地 repo 的可执行 jar - spring boot 项目
- javascript - 如何从 javascript 中检索 json 并传递给 servlet 并从数据中创建一个类
- javascript - 如何检测我从数组中单击的元素
- java - 在不同范围内提供相同类型的 Guice 提供程序 - 循环依赖
- bash - 从 BASH 中特定单词之间的文本文件中提取特定单词
- c++ - std::multiset 为插入和比较定义比较器
- python - 如何将不同的随机值添加到 numpy 数组的 n 个元素?