diff options
author | Radostin Stoyanov <rstoyanov1@gmail.com> | 2017-06-06 17:41:46 +0100 |
---|---|---|
committer | Cédric Bosdonnat <cbosdonnat@suse.com> | 2017-06-07 09:55:34 +0200 |
commit | 0b998e5c230cdf458a390d0d9c28c85f21b9fbd2 (patch) | |
tree | 702075ca5d63ce8f50e0d0ff0dfccd829a96ebe7 /sources.py | |
parent | 4c45f1771bd1ba655294ff325553fb5eba770f65 (diff) | |
download | virt-bootstrap.git-0b998e5c230cdf458a390d0d9c28c85f21b9fbd2.tar.gz virt-bootstrap.git-0b998e5c230cdf458a390d0d9c28c85f21b9fbd2.tar.xz virt-bootstrap.git-0b998e5c230cdf458a390d0d9c28c85f21b9fbd2.zip |
Cache downloaded container images
Store container images downloaded with skopeo to avoid re-download.
Allow user to disable this option by passing "--no-cache" parameter
Diffstat (limited to 'sources.py')
-rw-r--r-- | sources.py | 35 |
1 files changed, 27 insertions, 8 deletions
@@ -24,6 +24,15 @@ import shutil import subprocess import tempfile import getpass +import os + + +# default_image_dir - Path where Docker images (tarballs) will be stored +if os.geteuid() == 0: + default_image_dir = "/var/lib/virt-bootstrap/docker_images" +else: + default_image_dir = \ + os.environ['HOME'] + "/.local/share/virt-bootstrap/docker_images" def checksum(path, sum_type, sum_expected): @@ -40,7 +49,7 @@ def checksum(path, sum_type, sum_expected): class FileSource: - def __init__(self, url, username, password, insecure): + def __init__(self, url, *args): self.path = url.path def unpack(self, dest): @@ -51,18 +60,26 @@ class FileSource: class DockerSource: - def __init__(self, url, username, password, insecure): + def __init__(self, url, username, password, insecure, no_cache): self.registry = url.netloc self.image = url.path self.username = username self.password = password self.insecure = insecure + self.no_cache = no_cache if self.image and not self.image.startswith('/'): self.image = '/' + self.image self.url = "docker://" + self.registry + self.image def unpack(self, dest): - tmpDest = tempfile.mkdtemp('virt-bootstrap') + + if self.no_cache: + tmp_dest = tempfile.mkdtemp('virt-bootstrap') + images_dir = tmp_dest + else: + if not os.path.exists(default_image_dir): + os.makedirs(default_image_dir) + images_dir = default_image_dir try: # Run skopeo copy into a tmp folder @@ -71,7 +88,7 @@ class DockerSource: # folders for broader enablement cmd = ["skopeo", "copy", self.url, - "dir:%s" % tmpDest] + "dir:%s" % images_dir] if self.insecure: cmd.append('--src-tls-verify=false') if self.username: @@ -83,13 +100,13 @@ class DockerSource: subprocess.check_call(cmd) # Get the layers list from the manifest - mf = open("%s/manifest.json" % tmpDest, "r") + mf = open("%s/manifest.json" % images_dir, "r") manifest = json.load(mf) # FIXME We suppose the layers are ordered, is this true? for layer in manifest['layers']: sum_type, sum_value = layer['digest'].split(':') - layer_file = "%s/%s.tar" % (tmpDest, sum_value) + layer_file = "%s/%s.tar" % (images_dir, sum_value) print('layer_file: (%s) %s' % (sum_type, layer_file)) # Verify the checksum @@ -100,7 +117,9 @@ class DockerSource: subprocess.check_call(["tar", "xf", layer_file, "-C", dest]) except Exception: - shutil.rmtree(tmpDest) raise - shutil.rmtree(tmpDest) + finally: + # Clean up + if self.no_cache: + shutil.rmtree(tmp_dest) |