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

Cedric Bosdonnat cbosdonnat at suse.com
Tue Dec 12 15:33:35 UTC 2017


On Thu, 2017-12-07 at 20:42 +0000, Radostin Stoyanov wrote:
> 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"))

Do we really need to remove those file? after all they don't harm if
they stay in the cache, right?

> +            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.

ACK

--
Cedric




More information about the virt-tools-list mailing list