diff options
Diffstat (limited to 'src/virtBootstrap')
-rw-r--r-- | src/virtBootstrap/sources/docker_source.py | 16 | ||||
-rw-r--r-- | src/virtBootstrap/utils.py | 14 |
2 files changed, 27 insertions, 3 deletions
diff --git a/src/virtBootstrap/sources/docker_source.py b/src/virtBootstrap/sources/docker_source.py index a73fa64..ec1a812 100644 --- a/src/virtBootstrap/sources/docker_source.py +++ b/src/virtBootstrap/sources/docker_source.py @@ -137,10 +137,16 @@ class DockerSource(object): """ Download image layers using "skopeo copy". """ + + if self.no_cache: + dest_dir = self.images_dir + else: + dest_dir = utils.get_image_dir(no_cache=True) + # Note: we don't want to expose --src-cert-dir to users as # they should place the certificates in the system # folders for broader enablement - skopeo_copy = ["skopeo", "copy", self.url, "dir:" + self.images_dir] + skopeo_copy = ["skopeo", "copy", self.url, "dir:" + dest_dir] if self.insecure: skopeo_copy.append('--src-tls-verify=false') @@ -150,8 +156,12 @@ class DockerSource(object): self.progress("Downloading container image", value=0, logger=logger) # Run "skopeo copy" command self.read_skopeo_progress(skopeo_copy) - # Remove the manifest file as it is not needed - os.remove(os.path.join(self.images_dir, "manifest.json")) + + if not self.no_cache: + os.remove(os.path.join(dest_dir, "manifest.json")) + os.remove(os.path.join(dest_dir, "version")) + utils.copytree(dest_dir, self.images_dir) + shutil.rmtree(dest_dir) def parse_output(self, proc): """ diff --git a/src/virtBootstrap/utils.py b/src/virtBootstrap/utils.py index 20a59d2..ec6a96e 100644 --- a/src/virtBootstrap/utils.py +++ b/src/virtBootstrap/utils.py @@ -32,6 +32,7 @@ import subprocess import sys import tempfile import logging +import shutil import passlib.hosts @@ -355,6 +356,19 @@ def get_mime_type(path): return output.read().decode('utf-8').split()[1] +def copytree(src, dst, symlinks=False, ignore=None): + """ + Copy an entire directory of files into an existing directory. + """ + for item in os.listdir(src): + src_item = os.path.join(src, item) + dst_item = os.path.join(dst, item) + if os.path.isdir(src_item): + shutil.copytree(src_item, dst_item, symlinks, ignore) + else: + shutil.copy2(src_item, dst_item) + + def get_image_dir(no_cache=False): """ Get the directory where image layers are stored. |