Usage:
python delete_docker_image.py 192.168.2.1:5000/hello-world:latest --delete-layers| # coding: utf-8 | |
| import logging | |
| import sys | |
| import requests | |
| logger = logging.getLogger(__name__) | |
| logger.setLevel(logging.DEBUG) | |
| chandler = logging.StreamHandler(stream=sys.stdout) | |
| chandler.setLevel(logging.DEBUG) | |
| logger.addHandler(chandler) | |
| def delete_layer(host, name, sha): | |
| result = requests.delete( | |
| '{host}/v2/{name}/blobs/{sha}'.format(host=host, name=name, sha=sha), | |
| headers={ | |
| 'Accept': 'application/vnd.docker.distribution.manifest.v2+json', | |
| } | |
| ) | |
| logger.info(u'删除层 %s - %s: %s', name, sha, (u'成功' if result.status_code == 202 else u'失败')) | |
| def delete_image_ref(host, name, ref_id): | |
| result = requests.delete( | |
| '{host}/v2/{name}/manifests/{ref_id}'.format(host=host, name=name, ref_id=ref_id), | |
| headers={ | |
| 'Accept': 'application/vnd.docker.distribution.manifest.v2+json', | |
| } | |
| ) | |
| logger.info(u'删除镜像 %s (%s): %s', name, ref_id, (u'成功' if result.status_code == 202 else u'失败')) | |
| def delete_image(host, name, tag, delete_layers=False): | |
| # Get layer list | |
| layer_list_result = requests.get( | |
| '{host}/v2/{name}/manifests/{tag}'.format(host=host, name=name, tag=tag), | |
| headers={ | |
| 'Accept': 'application/vnd.docker.distribution.manifest.v2+json', | |
| } | |
| ) | |
| layer_list = layer_list_result.json()['layers'] | |
| # Get image ref id | |
| ref_id = layer_list_result.headers['Docker-Content-Digest'] | |
| # Delete image ref | |
| delete_image_ref(host, name, ref_id) | |
| if delete_layers: | |
| # Delete each layer | |
| for layer in layer_list: | |
| delete_layer(host, name, layer['digest']) | |
| if __name__ == '__main__': | |
| image = sys.argv[-2] | |
| delete_layers = sys.argv[-1] == '--delete-layers' | |
| # Parse image | |
| # 192.168.2.1:5000/image_name:image_tag | |
| _left, tag = image.rsplit(':', 1) | |
| host, name = _left.rsplit('/', 1) | |
| host = 'http://{}'.format(host) | |
| delete_image(host, name, tag, delete_layers=delete_layers) |