docker-py: Timeout incompatibility

Hi, i’m on a Debian Sid with docker-py 0.5.3-1 and i have a problem with timeout parameter :

import docker

c = docker.Client(base_url='unix://var/run/docker.sock', version='1.15', timeout=2.0)
l = c.containers(all=True)      

trace :

Traceback (most recent call last):                                                                                 
  File "./check.py", line 10, in <module>                                                                          
    l = c.containers(all=True)                                                                                     
  File "/usr/lib/python2.7/dist-packages/docker/client.py", line 493, in containers                                
    res = self._result(self._get(u, params=params), True)                                                          
  File "/usr/lib/python2.7/dist-packages/docker/client.py", line 76, in _get                                       
    return self.get(url, **self._set_request_timeout(kwargs))                                                      
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 469, in get                                   
    return self.request('GET', url, **kwargs)                                                                      
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 457, in request                               
    resp = self.send(prep, **send_kwargs)                                                                          
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 569, in send                                  
    r = adapter.send(request, **kwargs)                                                                            
  File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 362, in send                                  
    timeout=timeout                                                                                                
  File "/usr/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py", line 522, in urlopen        
    body=body, headers=headers)                                                                                    
  File "/usr/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py", line 305, in _make_request  
    timeout_obj = self._get_timeout(timeout)                                                                       
  File "/usr/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py", line 285, in _get_timeout   
    return Timeout.from_float(timeout)                                                                             
  File "/usr/lib/python2.7/dist-packages/requests/packages/urllib3/util/timeout.py", line 152, in from_float       
    return Timeout(read=timeout, connect=timeout)                                                                  
  File "/usr/lib/python2.7/dist-packages/requests/packages/urllib3/util/timeout.py", line 95, in __init__          
    self._connect = self._validate_timeout(connect, 'connect')                                                     
  File "/usr/lib/python2.7/dist-packages/requests/packages/urllib3/util/timeout.py", line 125, in _validate_timeout
    "int or float." % (name, value))                                                                               
ValueError: Timeout value connect was Timeout(connect=2.0, read=2.0, total=None), but it must be an int or float.  

To fix the problem i have to modify directly /usr/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py

def _get_timeout(self, timeout):                                            
    """ Helper that always returns a :class:`urllib3.util.Timeout` """      
    if timeout is _Default:                                                           
        return self.timeout.clone()                                         

    if isinstance(timeout, Timeout): <========================== Timeout is not a urllib3 timeout
        return timeout.clone()                                              
    else:                                                                   
        # User passed us an int/float. This is for backwards compatibility, 
        # can be removed later                                                                                                 
        return Timeout.from_float(timeout._connect ) <======================= manually entered _connect

I thnk it’s a docker-py problem…

About this issue

  • Original URL
  • State: closed
  • Created 10 years ago
  • Comments: 18 (6 by maintainers)

Commits related to this issue

Most upvoted comments

No yeah, actually, try downgrading your version of requests (pip install -U requests==2.5.3) and see if it helps.

What happens if you pip install -U requests==2.5.3? Same issue?

I do not think it is python-docker packaging problem, because when I install docker-py with pip install docker-py on debian Wheezy/Jessie I get the exact same problem.

Modifying the requests library is not a solution for me because it can break other libraries. So I changed docker-py as follows:

Replaced in /docker/unixconn/unixconn.py (usually under /usr/local/lib/python2.7/dist-packages):

try:
    import requests.packages.urllib3.connectionpool as connectionpool
except ImportError:
    import urllib3.connectionpool as connectionpool

With just import urllib3.connectionpool as connectionpool

And similarly I replaced in /docker/ssladapter/ssladapter.py:

try:
   import requests.packages.urllib3 as urllib3
except ImportError:
   import urllib3

With import urllib3

Same thing with from requests.packages.urllib3._collections import RecentlyUsedContainer