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.3KB

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