summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/virtBootstrap/sources/docker_source.py16
-rw-r--r--src/virtBootstrap/utils.py14
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.