Utility to re-run a docker container with slightly different arguments
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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()