Coverage for dlabel/dockerfile.py: 74%

35 statements  

« prev     ^ index     » next       coverage.py v7.10.0, created at 2025-07-25 23:32 +0000

1import docker 

2from .util import get_diff, get_archives 

3from logging import getLogger 

4 

5_log = getLogger(__name__) 

6 

7 

8def get_dockerfile(container: docker.models.containers.Container, # noqa: C901 

9 ignore, labels, do_output: bool): 

10 """make Dockerfile from running container""" 

11 import shlex 

12 deleted, added, modified, link = get_diff(container, ignore) 

13 if do_output: 13 ↛ 14line 13 didn't jump to line 14 because the condition on line 13 was never true

14 ignore_str = """* 

15!added.tar.gz 

16!modified.tar.gz 

17""" 

18 yield ".dockerignore", ignore_str.encode() 

19 added_tar = get_archives(container, added, ignore) 

20 if added_tar: 

21 yield "added.tar.gz", added_tar 

22 modified_tar = get_archives(container, modified, ignore) 

23 if modified_tar: 

24 yield "modified.tar.gz", modified_tar 

25 from_image = container.attrs.get("Config", {}).get("Image") 

26 res: list[str] = [] 

27 res.append(f"FROM {from_image}") 

28 if deleted: 

29 res.append("RUN rm -rf " + shlex.join(sorted(deleted))) 

30 if added: 

31 res.append("ADD added.tar.gz /") 

32 if modified: 

33 res.append("ADD modified.tar.gz /") 

34 for k, v in sorted(link.items()): 34 ↛ 35line 34 didn't jump to line 35 because the loop on line 34 never started

35 res.append(f"RUN ln -sf {shlex.quote(v)} {shlex.quote(k)}") 

36 if labels: 

37 image_labels = container.image.labels 

38 for k, v in container.labels.items(): 

39 if k.startswith("com.docker.compose."): 

40 continue 

41 if image_labels.get(k) != v: 

42 res.append(f"LABEL {shlex.quote(k)}={shlex.quote(v)}") 

43 yield "Dockerfile", "\n".join(res+[""]).encode()