The caching logic was a remnant of an older time when we had multiple shared layers building that went into the final image. It was arguable that it worked back then but it is definitely not needed now so into the bin it goes.
Signed-off-by: Alex Bennée <[email protected]> --- tests/docker/docker.py | 148 ++++++++++++++--------------------------- 1 file changed, 49 insertions(+), 99 deletions(-) diff --git a/tests/docker/docker.py b/tests/docker/docker.py index fd0cbdfe856..a2e97061240 100755 --- a/tests/docker/docker.py +++ b/tests/docker/docker.py @@ -15,7 +15,6 @@ import sys import subprocess import json -import hashlib import atexit import uuid import argparse @@ -27,7 +26,6 @@ from tarfile import TarFile, TarInfo from io import StringIO, BytesIO from shutil import copy, rmtree -from datetime import datetime, timedelta FILTERED_ENV_NAMES = ['ftp_proxy', 'http_proxy', 'https_proxy'] @@ -35,20 +33,9 @@ DEVNULL = open(os.devnull, 'wb') -def _bytes_checksum(bytes): - """Calculate a digest string unique to the text content""" - return hashlib.sha1(bytes).hexdigest() - -def _text_checksum(text): - """Calculate a digest string unique to the text content""" - return _bytes_checksum(text.encode('utf-8')) - def _read_dockerfile(path): return open(path, 'rt', encoding='utf-8').read() -def _file_checksum(filename): - return _bytes_checksum(open(filename, 'rb').read()) - def _guess_engine_command(): """ Guess a working engine command or raise exception if not found""" @@ -263,38 +250,15 @@ def inspect_tag(self, tag): except subprocess.CalledProcessError: return None - def get_image_creation_time(self, info): - return json.loads(info)[0]["Created"] - - def get_image_dockerfile_checksum(self, tag): - resp = self.inspect_tag(tag) - labels = json.loads(resp)[0]["Config"].get("Labels", {}) - return labels.get("com.qemu.dockerfile-checksum", "") - - def build_image(self, tag, docker_dir, dockerfile, - quiet=True, user=False, argv=None, registry=None, - extra_files_cksum=[]): + def build_image(self, tag, docker_dir, dockerfile_path, + quiet=True, user=False, argv=None, registry=None): if argv is None: argv = [] - if not _dockerfile_verify_flat(dockerfile): + if not _dockerfile_verify_flat(_read_dockerfile(dockerfile_path)): return -1 - checksum = _text_checksum(dockerfile) - - tmp_df = tempfile.NamedTemporaryFile(mode="w+t", - encoding='utf-8', - dir=docker_dir, suffix=".docker") - tmp_df.write(dockerfile) - - tmp_df.write("\n") - tmp_df.write("LABEL com.qemu.dockerfile-checksum=%s\n" % (checksum)) - for f, c in extra_files_cksum: - tmp_df.write("LABEL com.qemu.%s-checksum=%s\n" % (f, c)) - - tmp_df.flush() - - build_args = ["build", "-t", tag, "-f", tmp_df.name] + build_args = ["build", "-t", tag, "-f", dockerfile_path] if self._buildkit: build_args += ["--build-arg", "BUILDKIT_INLINE_CACHE=1"] @@ -320,13 +284,6 @@ def update_image(self, tag, tarball, quiet=True): self._do_check(["build", "-t", tag, "-"], quiet=quiet, stdin=tarball) - def image_matches_dockerfile(self, tag, dockerfile): - try: - checksum = self.get_image_dockerfile_checksum(tag) - except Exception: - return False - return checksum == _text_checksum(dockerfile) - def run(self, cmd, keep, quiet, as_user=False): label = uuid.uuid4().hex if not keep: @@ -412,61 +369,54 @@ def args(self, parser): help="Dockerfile name") def run(self, args, argv): - dockerfile = _read_dockerfile(args.dockerfile) tag = args.tag dkr = Docker(args.command) - if "--no-cache" not in argv and \ - dkr.image_matches_dockerfile(tag, dockerfile): - pass - else: - # Create a docker context directory for the build - docker_dir = tempfile.mkdtemp(prefix="docker_build") - - # Validate binfmt_misc will work - if args.skip_binfmt: - qpath = args.include_executable - elif args.include_executable: - qpath, enabled = _check_binfmt_misc(args.include_executable) - if not enabled: - return 1 - - # Is there a .pre file to run in the build context? - docker_pre = os.path.splitext(args.dockerfile)[0]+".pre" - if os.path.exists(docker_pre): - stdout = DEVNULL if args.quiet else None - rc = subprocess.call(os.path.realpath(docker_pre), - cwd=docker_dir, stdout=stdout) - if rc == 3: - print("Skip") - return 0 - elif rc != 0: - print("%s exited with code %d" % (docker_pre, rc)) - return 1 - - # Copy any extra files into the Docker context. These can be - # included by the use of the ADD directive in the Dockerfile. - cksum = [] - if args.include_executable: - # FIXME: there is no checksum of this executable and the linked - # libraries, once the image built any change of this executable - # or any library won't trigger another build. - _copy_binary_with_libs(args.include_executable, - qpath, docker_dir) - - for filename in args.extra_files or []: - _copy_with_mkdir(filename, docker_dir) - cksum += [(filename, _file_checksum(filename))] - - argv += ["--build-arg=" + k.lower() + "=" + v - for k, v in os.environ.items() - if k.lower() in FILTERED_ENV_NAMES] - dkr.build_image(tag, docker_dir, dockerfile, - quiet=args.quiet, user=args.user, - argv=argv, registry=args.registry, - extra_files_cksum=cksum) - - rmtree(docker_dir) + + # Create a docker context directory for the build + docker_dir = tempfile.mkdtemp(prefix="docker_build") + + # Validate binfmt_misc will work + if args.skip_binfmt: + qpath = args.include_executable + elif args.include_executable: + qpath, enabled = _check_binfmt_misc(args.include_executable) + if not enabled: + return 1 + + # Is there a .pre file to run in the build context? + docker_pre = os.path.splitext(args.dockerfile)[0]+".pre" + if os.path.exists(docker_pre): + stdout = DEVNULL if args.quiet else None + rc = subprocess.call(os.path.realpath(docker_pre), + cwd=docker_dir, stdout=stdout) + if rc == 3: + print("Skip") + return 0 + elif rc != 0: + print("%s exited with code %d" % (docker_pre, rc)) + return 1 + + # Copy any extra files into the Docker context. These can be + # included by the use of the ADD directive in the Dockerfile. + if args.include_executable: + # FIXME: there is no checksum of this executable and the linked + # libraries, once the image built any change of this executable + # or any library won't trigger another build. + _copy_binary_with_libs(args.include_executable, + qpath, docker_dir) + + for filename in args.extra_files or []: + _copy_with_mkdir(filename, docker_dir) + + argv += ["--build-arg=" + k.lower() + "=" + v + for k, v in os.environ.items() + if k.lower() in FILTERED_ENV_NAMES] + dkr.build_image(tag, docker_dir, args.dockerfile, + quiet=args.quiet, user=args.user, + argv=argv, registry=args.registry) + + rmtree(docker_dir) return 0 -- 2.47.3
