docker-py icon indicating copy to clipboard operation
docker-py copied to clipboard

`BadStatusLine` errors from Docker API

Open robin-wayve opened this issue 2 years ago • 0 comments

We get some infrequent/non-deterministic errors when using docker through testcontainers, a typical traceback looks like this (when trying to get logs from a container, but I think it has happened with other calls too):

  File "docker/docker/models/containers.py", line 306, in logs
    return self.client.api.logs(self.id, **kwargs)
  File "docker/docker/utils/decorators.py", line 19, in wrapped
    return f(self, resource_id, *args, **kwargs)
  File "docker/docker/api/container.py", line 869, in logs
    output = self._get_result(container, stream, res)
  File "docker/docker/api/client.py", line 460, in _get_result
    return self._get_result_tty(stream, res, self._check_is_tty(container))
  File "docker/docker/utils/decorators.py", line 19, in wrapped
    return f(self, resource_id, *args, **kwargs)
  File "docker/docker/api/client.py", line 456, in _check_is_tty
    cont = self.inspect_container(container)
  File "docker/docker/utils/decorators.py", line 19, in wrapped
    return f(self, resource_id, *args, **kwargs)
  File "docker/docker/api/container.py", line 772, in inspect_container
    self._get(self._url("/containers/{0}/json", container)), True
  File "docker/docker/utils/decorators.py", line 46, in inner
    return f(self, *args, **kwargs)
  File "docker/docker/api/client.py", line 237, in _get
    return self.get(url, **self._set_request_timeout(kwargs))
  File "requests/requests/sessions.py", line 555, in get
    return self.request('GET', url, **kwargs)
  File "requests/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "requests/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "requests/requests/adapters.py", line 498, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine('[...]'))

where the BadStatusLine contains what looks like the Docker Daemon API response body JSON, rather than HTTP/1.1 200 OK.

I'm not really sure how to investigate further as to where the fault might lie: I upgraded everything that seemed to be involved in the stack but it hasn't helped.

Versions

Ubuntu 20.04 Python 3.8.12

Pip

docker==5.0.3
requests==2.26.0
testcontainers==3.5.3
urllib3==1.26.9

Docker

Client: Docker Engine - Community
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 24 01:48:02 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.9
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.8
  Git commit:       79ea9d3
  Built:            Mon Oct  4 16:06:37 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.11
  GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

robin-wayve avatar Apr 11 '22 12:04 robin-wayve