docker.py: don't hang on large docker output

Unlike Popen.communicate(), subprocess.call() doesn't read from the
stdout file descriptor. If the child process produces more output than
fits into the pipe buffer, it will block indefinitely.

If we don't intend to consume the output, just send it straight to
/dev/null to avoid this issue.

Signed-off-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Message-Id: <1473192351-601-2-git-send-email-silbe@linux.vnet.ibm.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
Sascha Silbe 2016-09-06 22:05:44 +02:00 committed by Fam Zheng
parent 9af4c174a3
commit c977257045

View File

@ -25,6 +25,10 @@ from tarfile import TarFile, TarInfo
from StringIO import StringIO
from shutil import copy, rmtree
DEVNULL = open(os.devnull, 'wb')
def _text_checksum(text):
"""Calculate a digest string unique to the text content"""
return hashlib.sha1(text).hexdigest()
@ -34,8 +38,7 @@ def _guess_docker_command():
commands = [["docker"], ["sudo", "-n", "docker"]]
for cmd in commands:
if subprocess.call(cmd + ["images"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE) == 0:
stdout=DEVNULL, stderr=DEVNULL) == 0:
return cmd
commands_txt = "\n".join([" " + " ".join(x) for x in commands])
raise Exception("Cannot find working docker command. Tried:\n%s" % \
@ -98,7 +101,7 @@ class Docker(object):
def _do(self, cmd, quiet=True, infile=None, **kwargs):
if quiet:
kwargs["stdout"] = subprocess.PIPE
kwargs["stdout"] = DEVNULL
if infile:
kwargs["stdin"] = infile
return subprocess.call(self._command + cmd, **kwargs)