[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