我正在使用 Docker-py和 dockerpty为了使用 Docker
Python API 执行 exec
命令。
代码很简单:
container = client.inspect_container(containerId)[0]
dockerpty.exec_command(client, container, command)
当我想执行诸如 echo 'hello'
之类的命令时,它工作正常。但是,像 /bin/bash
这样的命令,即使我能够获得终端,它也会导致以下错误:
ubuntu:test$ python main.py exec [containerid] /bin/bash
root@so1:/opt/apache# Traceback (most recent call last):
File "__main__.py", line 216, in <module>
main()
File "__main__.py", line 201, in main
ec.execute()
dockerpty.exec_command(client, container, command)
File "/usr/local/lib/python2.7/site-packages/dockerpty/__init__.py", line 44, in exec_command
PseudoTerminal(client, operation).start()
File "/usr/local/lib/python2.7/site-packages/dockerpty/pty.py", line 334, in start
self._hijack_tty(pumps)
File "/usr/local/lib/python2.7/site-packages/dockerpty/pty.py", line 373, in _hijack_tty
pump.flush()
File "/usr/local/lib/python2.7/site-packages/dockerpty/io.py", line 367, in flush
read = self.from_stream.read(n)
File "/usr/local/lib/python2.7/site-packages/dockerpty/io.py", line 120, in read
return self.fd.recv(n)
File "/usr/local/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 194, in recv
data = self.connection.recv(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1302, in recv
self._raise_ssl_error(self._ssl, result)
File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1172, in _raise_ssl_error
_raise_current_error()
File "/usr/local/lib/python2.7/site-packages/OpenSSL/_util.py", line 48, in exception_from_error_queue
raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert protocol version')]
当我创建客户端时,我指定了 tls_config
以使用 tlsv1.2
:
tls_config = docker.tls.TLSConfig(
client_cert=(cert, key),
ssl_version=ssl.PROTOCOL_TLSv1_2,
)
client = docker.Client(base_url=url, timeout=timeout,
tls=tls_config, user_agent=user_agent)
为什么我会收到此 'tlsv1 alert protocol version'
错误,我该如何解决?
最佳答案
在一些旧版本的 Python 中,ssl.PROTOCOL_TLSv1_2
不可用。您可以通过尝试从容器内的 Python 控制台导入它来轻松检查:
root@57c6d8b01861:/# python
Python 2.7.8 (default, Nov 26 2014, 22:28:51)
>>> import ssl
>>> ssl.PROTOCOL_TLSv1_2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'PROTOCOL_TLSv1_2'
>>> ssl.PROTOCOL_TLSv1
3
如果是这种情况,请尝试将 docker 镜像中的 Python 更新为 >=2.7.9
。
还要确保 openssl
版本为 >=1.0.1
。
关于Python - Docker客户端连接中的tlsv1警报协议(protocol)版本错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39709781/