Use tempfiles instead of memfiles for build contexts

This commit is contained in:
shin- 2013-08-14 23:11:53 +02:00
parent c31ce82d2c
commit d0c54361d9
1 changed files with 20 additions and 19 deletions

View File

@ -6,6 +6,7 @@ import re
import six import six
import shlex import shlex
import tarfile import tarfile
import tempfile
import six import six
import httplib import httplib
import socket import socket
@ -121,27 +122,25 @@ class Client(requests.Session):
} }
def _mkbuildcontext(self, dockerfile): def _mkbuildcontext(self, dockerfile):
memfile = StringIO() f = tempfile.TemporaryFile()
try: t = tarfile.open(mode='w', fileobj=f)
t = tarfile.open(mode='w', fileobj=memfile) if isinstance(dockerfile, StringIO):
if isinstance(dockerfile, StringIO): dfinfo = tarfile.TarInfo('Dockerfile')
dfinfo = tarfile.TarInfo('Dockerfile') dfinfo.size = dockerfile.len
dfinfo.size = dockerfile.len else:
else: dfinfo = t.gettarinfo(fileobj=dockerfile, arcname='Dockerfile')
dfinfo = t.gettarinfo(fileobj=dockerfile, arcname='Dockerfile') t.addfile(dfinfo, dockerfile)
t.addfile(dfinfo, dockerfile) t.close()
return memfile.getvalue() f.seek(0)
finally: return f
memfile.close()
def _tar(self, path): def _tar(self, path):
memfile = StringIO() f = tempfile.TemporaryFile()
try: t = tarfile.open(mode='w', fileobj=f)
t = tarfile.open(mode='w', fileobj=memfile) t.add(path, arcname='.')
t.add(path, arcname='.') t.close()
return memfile.getvalue() f.seek(0)
finally: return f
memfile.close()
def _post_json(self, url, data, **kwargs): def _post_json(self, url, data, **kwargs):
# Go <1.1 can't unserialize null to a string # Go <1.1 can't unserialize null to a string
@ -233,6 +232,8 @@ class Client(requests.Session):
headers = { 'Content-Type': 'application/tar' } headers = { 'Content-Type': 'application/tar' }
res = self._result(self.post(u, context, params=params, res = self._result(self.post(u, context, params=params,
headers=headers, stream=True)) headers=headers, stream=True))
if context is not None:
context.close()
srch = r'Successfully built ([0-9a-f]+)' srch = r'Successfully built ([0-9a-f]+)'
match = re.search(srch, res) match = re.search(srch, res)
if not match: if not match: