Coverage for dlabel/dockerfile.py: 74%
35 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-26 23:07 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-26 23:07 +0000
1from logging import getLogger
3import docker
5from .util import get_archives, get_diff
7_log = getLogger(__name__)
10def get_dockerfile(
11 container: docker.models.containers.Container, ignore, labels, do_output: bool
12):
13 """make Dockerfile from running container"""
14 import shlex
16 deleted, added, modified, link = get_diff(container, ignore)
17 if do_output: 17 ↛ 18line 17 didn't jump to line 18 because the condition on line 17 was never true
18 ignore_str = """*
19!added.tar.gz
20!modified.tar.gz
21"""
22 yield ".dockerignore", ignore_str.encode()
23 added_tar = get_archives(container, added, ignore)
24 if added_tar:
25 yield "added.tar.gz", added_tar
26 modified_tar = get_archives(container, modified, ignore)
27 if modified_tar:
28 yield "modified.tar.gz", modified_tar
29 from_image = container.attrs.get("Config", {}).get("Image")
30 res: list[str] = []
31 res.append(f"FROM {from_image}")
32 if deleted:
33 res.append("RUN rm -rf " + shlex.join(sorted(deleted)))
34 if added:
35 res.append("ADD added.tar.gz /")
36 if modified:
37 res.append("ADD modified.tar.gz /")
38 for k, v in sorted(link.items()): 38 ↛ 39line 38 didn't jump to line 39 because the loop on line 38 never started
39 res.append(f"RUN ln -sf {shlex.quote(v)} {shlex.quote(k)}")
40 if labels:
41 image_labels = container.image.labels
42 for k, v in container.labels.items():
43 if k.startswith("com.docker.compose."):
44 continue
45 if image_labels.get(k) != v:
46 res.append(f"LABEL {shlex.quote(k)}={shlex.quote(v)}")
47 yield "Dockerfile", "\n".join(res + [""]).encode()