Skip to main content
 首页 » 编程设计

Python之Docker客户端连接中的tlsv1警报协议(protocol)版本错误

2025年04月02日25kuangbin

我正在使用 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。