run-docker 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/env python3
  2. import argparse
  3. import os
  4. import sys
  5. import common
  6. import shell_helpers
  7. from shell_helpers import LF
  8. container_name = common.consts['repo_short_id']
  9. container_hostname = common.consts['repo_short_id']
  10. image_name = common.consts['repo_short_id']
  11. target_dir = '/root/{}'.format(common.consts['repo_short_id'])
  12. docker = ['sudo', 'docker']
  13. def create(args):
  14. sh.run_cmd(docker + ['build', '-t', image_name, '.', LF])
  15. # --privileged for KVM:
  16. # https://stackoverflow.com/questions/48422001/launching-qemu-kvm-from-inside-docker-container
  17. sh.run_cmd(
  18. docker +
  19. [
  20. 'create', LF,
  21. '--hostname', container_hostname, LF,
  22. '-i', LF,
  23. '--name', container_name, LF,
  24. '--net', 'host', LF,
  25. '--privileged', LF,
  26. '-t', LF,
  27. '-w', target_dir, LF,
  28. '-v', '{}:{}'.format(os.getcwd(), target_dir), LF,
  29. image_name,
  30. ]
  31. )
  32. def destroy(args):
  33. stop(args)
  34. sh.run_cmd(docker + ['rm', container_name, LF])
  35. sh.run_cmd(docker + ['rmi', image_name, LF])
  36. def sh_func(args):
  37. start(args)
  38. if args:
  39. sh_args = args
  40. else:
  41. sh_args = ['bash']
  42. exit_status = sh.run_cmd(
  43. docker + ['exec', '-i', '-t', container_name] +
  44. sh_args +
  45. [LF],
  46. raise_on_failure=False
  47. )
  48. sys.exit(exit_status)
  49. def start(args):
  50. sh.run_cmd(docker + ['start', container_name, LF])
  51. def stop(args):
  52. sh.run_cmd(docker + ['stop', container_name, LF])
  53. cmd_action_map = {
  54. 'create': lambda args: create(args),
  55. 'DESTROY': lambda args: destroy(args),
  56. 'sh': lambda args: sh_func(args),
  57. 'start': lambda args: start(args),
  58. 'stop': lambda args: stop(args),
  59. }
  60. parser = argparse.ArgumentParser()
  61. parser.add_argument('--dry-run', default=False, action='store_true')
  62. parser.add_argument('cmd', choices=cmd_action_map, default='sh', nargs='?')
  63. parser.add_argument('args', nargs='*')
  64. args = parser.parse_args()
  65. sh = shell_helpers.ShellHelpers(dry_run=args.dry_run)
  66. cmd_action_map[args.cmd](args.args)