run.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import sys
  2. from pathlib import Path
  3. from metadocker.cmdline.commands.base import Command, Argument
  4. from metadocker.common.errors import SimpleError
  5. from metadocker.docker import DockerBuilder
  6. from metadocker.docker.driver import driver
  7. class RunCommand(Command):
  8. NAME = "run"
  9. HELP = "Initialise le conteneur"
  10. ARGUMENTS = [
  11. Argument("--root", "-r", action="store_true", help="Lance avec utilisateur root"),
  12. Argument("--interactive", "-i", action="store_true", help="Lance en mode interactif"),
  13. Argument("commande", nargs="*", help="Command à lancer")
  14. ]
  15. def _rm_if_needed(self, env, docker):
  16. for data in driver.ps(name=docker.name):
  17. if data.running:
  18. raise SimpleError(f"Erreur le conteneur '{docker.name}' est déja lancé")
  19. driver.rm(docker.name)
  20. def run(self, env):
  21. docker = DockerBuilder(env)
  22. env = env.get_env()
  23. self._rm_if_needed(env, docker)
  24. cmdline = ["-i" if self.interactive else "-d",
  25. #"--rm"
  26. ]
  27. if self.root:
  28. cmdline.extend(("-u", "0"))
  29. for host, container in env.PORTS.items():
  30. cmdline.extend(("-p", f"{host}:{container}"))
  31. for host, container in env.VOLUMES.items():
  32. host = Path(host)
  33. host.mkdir(exist_ok=True, parents=True)
  34. if not host.is_absolute():
  35. host = f"./{host}"
  36. cmdline.extend(("-v", f"{host}:{container}"))
  37. cmdline.extend(("--name", docker.name, "-t", docker.tag))
  38. cmdline.extend(self.commande)
  39. kwargs = {"catch": False}
  40. if self.interactive:
  41. kwargs["stdin"]=sys.stdin
  42. data = driver.ps(name=docker.name)
  43. driver.run(*cmdline, **kwargs)