Utility to re-run a docker container with slightly different arguments
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

docker-rerun 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/python3
  2. import argparse
  3. import inspect
  4. import json
  5. import subprocess
  6. import sys
  7. def inspect_container(container):
  8. output = subprocess.check_output(['docker', 'inspect',
  9. '--type=container', container])
  10. return json.loads(output.decode('utf-8'))[0]
  11. def handle_binds(container, config):
  12. if container['HostConfig']['Binds']:
  13. config['args'].extend(['--volume=%s' % bind
  14. for bind in container['HostConfig']['Binds']])
  15. def handle_image(container, config):
  16. config['image'] = container['Config']['Image']
  17. def handle_name(container, config):
  18. # Trim the leading / off the name. They're equivalent from docker's point
  19. # of view, but having the plain name looks nicer from a human point of view.
  20. config['args'].append('--name=%s' % container['Name'][1:])
  21. def handle_network_mode(container, config):
  22. network = container['HostConfig']['NetworkMode']
  23. if network != 'default':
  24. config['args'].append('--net=%s' % network)
  25. def handle_ports(container, config):
  26. ports = container['HostConfig']['PortBindings']
  27. if ports:
  28. for port, bindings in ports.items():
  29. for binding in bindings:
  30. if binding['HostIp']:
  31. config['args'].append('-p=%s:%s:%s' % (binding['HostIp'],
  32. binding['HostPort'],
  33. port))
  34. elif binding['HostPort']:
  35. config['args'].append('-p=%s:%s' % (binding['HostPort'],
  36. port))
  37. else:
  38. config['args'].append('-p=%s' % port)
  39. def handle_restart(container, config):
  40. policy = container['HostConfig']['RestartPolicy']
  41. if policy and policy['Name'] != 'no':
  42. arg = '--restart=%s' % policy['Name']
  43. if policy['MaximumRetryCount'] > 0:
  44. arg += ':%s' % policy['MaximumRetryCount']
  45. config['args'].append(arg)
  46. def handle_volumes_from(container, config):
  47. if container['HostConfig']['VolumesFrom']:
  48. config['args'].extend(['--volumes-from=%s' % cont for
  49. cont in container['HostConfig']['VolumesFrom']])
  50. def functions():
  51. return [m for m
  52. in inspect.getmembers(sys.modules[__name__])
  53. if inspect.isfunction(m[1])]
  54. def handlers():
  55. return [func for (name, func) in functions() if name.startswith('handle_')]
  56. def main():
  57. parser = argparse.ArgumentParser(description='Reruns docker containers ' \
  58. 'with different parameters.')
  59. parser.add_argument('container', type=str, help='The container to rerun')
  60. parser.add_argument('-d', '--dry-run', action='store_true',
  61. help='Don\'t actually re-run the container, just ' \
  62. 'print what would happen.')
  63. args = parser.parse_args()
  64. container = inspect_container(args.container)
  65. docker_config = {'args': ['-d'], 'image': ''}
  66. for handler in handlers():
  67. handler(container, docker_config)
  68. commands = [
  69. ['docker', 'stop', args.container],
  70. ['docker', 'rm', args.container],
  71. ['docker', 'run'] + docker_config['args'] + [docker_config['image']],
  72. ]
  73. if args.dry_run:
  74. print('Performing dry run for container %s. The following would be ' \
  75. 'executed:' % args.container)
  76. for command in commands:
  77. print(' '.join(command))
  78. else:
  79. print('Re-running container %s...' % args.container)
  80. for command in commands:
  81. subprocess.check_call(command)
  82. if __name__ == "__main__":
  83. main()