Skip to content

Commit 3d6d5e1

Browse files
committed
Merge pull request #441 from dims/fix-log-streams
Fix to enable streaming container logs reliably
2 parents 648baa6 + 9676feb commit 3d6d5e1

File tree

1 file changed

+14
-28
lines changed

1 file changed

+14
-28
lines changed

docker/client.py

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -321,40 +321,26 @@ def _multiplexed_buffer_helper(self, response):
321321
walker = end
322322
yield buf[start:end]
323323

324-
def _multiplexed_socket_stream_helper(self, response):
324+
def _multiplexed_response_stream_helper(self, response):
325325
"""A generator of multiplexed data blocks coming from a response
326-
socket."""
327-
socket = self._get_raw_response_socket(response)
328-
329-
def recvall(socket, size):
330-
blocks = []
331-
while size > 0:
332-
if six.PY3:
333-
block = socket._sock.recv(size)
334-
else:
335-
block = socket.recv(size)
336-
if not block:
337-
return None
338-
339-
blocks.append(block)
340-
size -= len(block)
326+
stream."""
341327

342-
sep = bytes() if six.PY3 else str()
343-
data = sep.join(blocks)
344-
return data
328+
# Disable timeout on the underlying socket to prevent
329+
# Read timed out(s) for long running processes
330+
socket = self._get_raw_response_socket(response)
331+
if six.PY3:
332+
socket._sock.settimeout(None)
333+
else:
334+
socket.settimeout(None)
345335

346336
while True:
347-
if six.PY3:
348-
socket._sock.settimeout(None)
349-
else:
350-
socket.settimeout(None)
351-
header = recvall(socket, STREAM_HEADER_SIZE_BYTES)
337+
header = response.raw.read(STREAM_HEADER_SIZE_BYTES)
352338
if not header:
353339
break
354340
_, length = struct.unpack('>BxxxL', header)
355341
if not length:
356342
break
357-
data = recvall(socket, length)
343+
data = response.raw.read(length)
358344
if not data:
359345
break
360346
yield data
@@ -388,7 +374,7 @@ def stream_result():
388374

389375
sep = bytes() if six.PY3 else str()
390376

391-
return stream and self._multiplexed_socket_stream_helper(response) or \
377+
return stream and self._multiplexed_response_stream_helper(response) or \
392378
sep.join([x for x in self._multiplexed_buffer_helper(response)])
393379

394380
def attach_socket(self, container, params=None, ws=False):
@@ -606,7 +592,7 @@ def execute(self, container, cmd, detach=False, stdout=True, stderr=True,
606592
data=data, stream=stream)
607593
self._raise_for_status(res)
608594
if stream:
609-
return self._multiplexed_socket_stream_helper(res)
595+
return self._multiplexed_response_stream_helper(res)
610596
elif six.PY3:
611597
return bytes().join(
612598
[x for x in self._multiplexed_buffer_helper(res)]
@@ -776,7 +762,7 @@ def logs(self, container, stdout=True, stderr=True, stream=False,
776762
url = self._url("/containers/{0}/logs".format(container))
777763
res = self._get(url, params=params, stream=stream)
778764
if stream:
779-
return self._multiplexed_socket_stream_helper(res)
765+
return self._multiplexed_response_stream_helper(res)
780766
elif six.PY3:
781767
return bytes().join(
782768
[x for x in self._multiplexed_buffer_helper(res)]

0 commit comments

Comments
 (0)