[virt-bootstrap] [PATCH 1/1] docker-source: Avoid skopeo copy in cache

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The `skopeo copy` command has changed it's behaviour to keep only a files for
single container image per directory. To get around this and keep cache of
downloaded images is used temporary destination directory for 'skopeo copy'
and image files are then moved in the cache folder.
---
 src/virtBootstrap/sources/docker_source.py | 16 +++++++++++++---
 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.
-- 
2.13.6

_______________________________________________
virt-tools-list mailing list
virt-tools-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/virt-tools-list



[Index of Archives]     [Linux Virtualization]     [KVM Development]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]     [Video 4 Linux]

  Powered by Linux