35
36
DEVNULL = open(os.devnull, 'wb')
37
38
-class EngineEnum(enum.IntEnum):
39
- AUTO = 1
40
- DOCKER = 2
41
- PODMAN = 3
42
-
43
- def __str__(self):
44
- return self.name.lower()
45
-
46
- def __repr__(self):
47
- return str(self)
48
-
49
- @staticmethod
50
- def argparse(s):
51
- try:
52
- return EngineEnum[s.upper()]
53
- except KeyError:
54
- return s
55
-
56
-
57
-USE_ENGINE = EngineEnum.AUTO
58
-
38
def _bytes_checksum(bytes):
39
"""Calculate a digest string unique to the text content"""
40
return hashlib.sha1(bytes).hexdigest()
52
53
def _guess_engine_command():
54
""" Guess a working engine command or raise exception if not found"""
76
- commands = []
77
-
78
- if USE_ENGINE in [EngineEnum.AUTO, EngineEnum.PODMAN]:
79
- commands += [["podman"], ["podman-remote"], ["podman", "--remote"]]
80
- if USE_ENGINE in [EngineEnum.AUTO, EngineEnum.DOCKER]:
81
- commands += [["docker"], ["sudo", "-n", "docker"]]
55
+ commands = [["podman"],
56
+ ["podman-remote"],
57
+ ["podman", "--remote"],
58
+ ["docker"],
59
+ ["sudo", "-n", "docker"]]
60
for cmd in commands:
61
try:
62
# 'version' is not sufficient to prove a working binary
200
201
class Docker(object):
202
""" Running Docker commands """
225
- def __init__(self):
226
- self._command = _guess_engine_command()
203
+ def __init__(self, commandstr=None):
204
+ if commandstr is None:
205
+ self._command = _guess_engine_command()
206
+ else:
207
+ self._command = commandstr.split(" ")
208
209
if ("docker" in self._command and
210
"TRAVIS" not in os.environ and
392
help="Run container using the current user's uid")
393
394
def run(self, args, argv):
414
- return Docker().run(argv, args.keep, quiet=args.quiet,
415
- as_user=args.run_as_current_user)
395
+ return Docker(args.command).run(argv, args.keep, quiet=args.quiet,
396
+ as_user=args.run_as_current_user)
397
398
399
class BuildCommand(SubCommand):
426
dockerfile = _read_dockerfile(args.dockerfile)
427
tag = args.tag
428
448
- dkr = Docker()
429
+ dkr = Docker(args.command)
430
if "--no-cache" not in argv and \
431
dkr.image_matches_dockerfile(tag, dockerfile):
432
if not args.quiet:
493
help="Docker registry")
494
495
def run(self, args, argv):
515
- dkr = Docker()
496
+ dkr = Docker(args.command)
497
dkr.command(cmd="pull", quiet=args.quiet,
498
argv=["%s/%s" % (args.registry, args.tag)])
499
dkr.command(cmd="tag", quiet=args.quiet,
571
tmp.seek(0)
572
573
# Run the build with our tarball context
593
- dkr = Docker()
574
+ dkr = Docker(args.command)
575
dkr.update_image(args.tag, tmp, quiet=args.quiet)
576
577
return 0
582
name = "clean"
583
584
def run(self, args, argv):
604
- Docker().clean()
585
+ Docker(args.command).clean()
586
return 0
587
588
591
name = "images"
592
593
def run(self, args, argv):
613
- return Docker().command("images", argv, args.quiet)
594
+ return Docker(args.command).command("images", argv, args.quiet)
595
596
597
class ProbeCommand(SubCommand):
600
601
def run(self, args, argv):
602
try:
622
- docker = Docker()
603
+ docker = Docker(args.command)
604
print(" ".join(docker._command))
605
except Exception:
606
print("no")
632
cmd += ["-v", "%s:%s:ro,z" % (p, p)]
633
cmd += [args.image, args.cc]
634
cmd += argv
654
- return Docker().run(cmd, False, quiet=args.quiet,
655
- as_user=True)
635
+ return Docker(args.command).run(cmd, False, quiet=args.quiet,
636
+ as_user=True)
637
638
639
def main():
659
- global USE_ENGINE
660
-
640
parser = argparse.ArgumentParser(description="A Docker helper",
641
usage="%s <subcommand> ..." %
642
os.path.basename(sys.argv[0]))
664
- parser.add_argument("--engine", type=EngineEnum.argparse, choices=list(EngineEnum),
665
- help="specify which container engine to use")
643
+ parser.add_argument("--command",
644
+ help="specify which container engine command to use")
645
subparsers = parser.add_subparsers(title="subcommands", help=None)
646
for cls in SubCommand.__subclasses__():
647
cmd = cls()
650
cmd.args(subp)
651
subp.set_defaults(cmdobj=cmd)
652
args, argv = parser.parse_known_args()
674
- if args.engine:
675
- USE_ENGINE = args.engine
653
return args.cmdobj.run(args, argv)
654
655