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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. if args.dry_run:
  58. print('docker stop %s' % args.container)
  59. print('docker rm %s' % args.container)
  60. print('docker run %s %s' % (' '.join(docker_config['args']), docker_config['image']))
  61. if __name__ == "__main__":
  62. main()