How to get the list of dependent child images in Docker?

后端 未结 12 848
耶瑟儿~
耶瑟儿~ 2020-12-12 11:22

I\'m trying to remove an image and I get:

# docker rmi f50f9524513f  
Failed to remove image (f50f9524513f): Error response from daemon: conflict: unable to          


        
12条回答
  •  粉色の甜心
    2020-12-12 12:16

    Short answer: Here is a python3 script that lists dependent docker images.

    Long answer: You can see the image id and parent id for all image created after the image in question with the following:

    docker inspect --format='{{.Id}} {{.Parent}}' \
        $(docker images --filter since=f50f9524513f --quiet)
    

    You should be able to look for images with parent id starting with f50f9524513f, then look for child images of those, etc.. But .Parent isn’t what you think., so in most cases you would need to specify docker images --all above to make that work, then you will get image ids for all intermediate layers as well.

    Here's a more limited python3 script to parse the docker output and do the searching to generate the list of images:

    #!/usr/bin/python3
    import sys
    
    def desc(image_ids, links):
        if links:
            link, *tail = links
            if len(link) > 1:
                image_id, parent_id = link
                checkid = lambda i: parent_id.startswith(i)
                if any(map(checkid, image_ids)):
                    return desc(image_ids | {image_id}, tail)
            return desc(image_ids, tail)
        return image_ids
    
    
    def gen_links(lines):
        parseid = lambda s: s.replace('sha256:', '')
        for line in reversed(list(lines)):
            yield list(map(parseid, line.split()))
    
    
    if __name__ == '__main__':
        image_ids = {sys.argv[1]}
        links = gen_links(sys.stdin.readlines())
        trunc = lambda s: s[:12]
        print('\n'.join(map(trunc, desc(image_ids, links))))
    

    If you save this as desc.py you could invoke it as follows:

    docker images \
        | fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \
            $(docker images --all --quiet) \
            | python3 desc.py f50f9524513f )
    

    Or just use the gist above, which does the same thing.

提交回复
热议问题