JokerQyou
9/29/2017 - 7:25 AM

Wtf is with these docker registry clients, I just want to delete an image.

Wtf is with these docker registry clients, I just want to delete an image.

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

Usage:

python delete_docker_image.py 192.168.2.1:5000/hello-world:latest --delete-layers