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

后端 未结 12 811
耶瑟儿~
耶瑟儿~ 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:00

    You can delete Docker images irrespective of parent and child relation through the below directory of Docker

    /var/lib/docker/image/devicemapper/imagedb/content/sha256
    

    In this directory you can find Docker images, so you can delete what you want.

    0 讨论(0)
  • 2020-12-12 12:04

    I've created a gist with shell script to print out descendant tree of a docker image, should anyone be interested in bash solution:

    #!/bin/bash
    parent_short_id=$1
    parent_id=`docker inspect --format '{{.Id}}' $1`
    
    get_kids() {
        local parent_id=$1
        docker inspect --format='ID {{.Id}} PAR {{.Parent}}' $(docker images -a -q) | grep "PAR ${parent_id}" | sed -E "s/ID ([^ ]*) PAR ([^ ]*)/\1/g"
    }
    
    print_kids() {
        local parent_id=$1
        local prefix=$2
        local tags=`docker inspect --format='{{.RepoTags}}' ${parent_id}`
        echo "${prefix}${parent_id} ${tags}"
    
        local children=`get_kids "${parent_id}"`
    
        for c in $children;
        do
            print_kids "$c" "$prefix  "
        done
    }
    
    print_kids "$parent_id" ""
    
    0 讨论(0)
  • 2020-12-12 12:06

    This is what I did in order to preserve my final "image" (layer, really - which is what threw me off, as I am just getting into docker builds).

    I was getting the whole "... cannot be forced..." message. I realized I couldn't delete the images I didn't need because they are not really independent images created by 'docker commit'. My issue was, I had several images (or layers) between the base image and my final, and just trying to clean up is where I met the error/warning about the child and parent.

    1. I exported the final image (or layer, if you will) out to a tarball.
    2. I then deleted all the images I wanted to, including my final - I have it saved to a tarball so, while I wasn't sure if I would be able to use it, I was just experimenting.
    3. I then ran docker image load -i FinalImage.tar.gz. The output was something like:

    7d9b54235881: Loading layer [==================================================>]  167.1MB/167.1MB
    c044b7095786: Loading layer [==================================================>]  20.89MB/20.89MB
    fe94dbd0255e: Loading layer [==================================================>]  42.05MB/42.05MB
    19abaa1dc0d4: Loading layer [==================================================>]  37.96MB/37.96MB
    4865d7b6fdb2: Loading layer [==================================================>]  169.6MB/169.6MB
    a0c115c7b87c: Loading layer [==================================================>]    132MB/132MB
    

    Loaded image ID: sha256:82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85acf9edc47b41dacfd6382

    Now, when I list with 'docker image ls', I only have the original base image, and the final image I previously saved to a tarball.

    [root@docker1 ~]# docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    httpd               import              82d4f8ef9ea1        3 days ago          747MB
    centos              httpd               36540f359ca3        5 weeks ago         193MB
    

    My system is 'clean' now. I only have the images I want. I even deleted the base image without a problem.

    [root@docker1 ~]# docker rmi 36540f359ca3
    Untagged: centos:httpd
    Untagged:     centos@sha256:c1010e2fe2b635822d99a096b1f4184becf5d1c98707cbccae00be663a9b9131
    Deleted: sha256:36540f359ca3b021d4b6a37815e9177b6c2bb3817598979ea55aee7ecc5c2c1f
    
    0 讨论(0)
  • 2020-12-12 12:11

    Here's a solution based on the Python API (pip install docker) that recursively lists descendants together with their tags (if any), increasing the indentation according to the depth of the relationship (children, grandchildren, etc.):

    import argparse
    import docker
    
    def find_img(img_idx, id):
        try:
            return img_idx[id]
        except KeyError:
            for k, v in img_idx.items():
                if k.rsplit(":", 1)[-1].startswith(id):
                    return v
        raise RuntimeError("No image with ID: %s" % id)
    
    def get_children(img_idx):
        rval = {}
        for img in img_idx.values():
            p_id = img.attrs["Parent"]
            rval.setdefault(p_id, set()).add(img.id)
        return rval
    
    def print_descendants(img_idx, children_map, img_id, indent=0):
        children_ids = children_map.get(img_id, [])
        for id in children_ids:
            child = img_idx[id]
            print(" " * indent, id, child.tags)
            print_descendants(img_idx, children_map, id, indent=indent+2)
    
    def main(args):
        client = docker.from_env()
        img_idx = {_.id: _ for _ in client.images.list(all=True)}
        img = find_img(img_idx, args.id)
        children_map = get_children(img_idx)
        print_descendants(img_idx, children_map, img.id)
    
    if __name__ == "__main__":
        parser = argparse.ArgumentParser(description=__doc__)
        parser.add_argument("id", metavar="IMAGE_ID")
        main(parser.parse_args())
    

    Example:

    $ python find_dep_img.py 549afbf12931
     sha256:913d0981fdc7d2d673f2c8135b7afd32ba5037755e89b00432d3460422ba99b9 []
       sha256:0748dbc043b96ef9f88265c422e0267807f542e364b7a7fadf371ba5ee082b5d []
         sha256:6669414d2a0cc31b241a1fbb00c0ca00fa4dc4fa65dffb532bac90d3943d6a0a []
           sha256:a6441e7d9e92511608aad631f9abe8627033de41305c2edf7e03ee36f94f0817 ['foo/bar:latest']
    

    I've made it available as a gist at https://gist.github.com/simleo/10ad923f9d8a2fa410f7ec2d7e96ad57

    0 讨论(0)
  • 2020-12-12 12:11

    I was also facing the same issue. Fallowed steps below to resolve the issue.

    Stop all running containers

    docker stop $(docker ps -aq) Remove all containers

    docker rm $(docker ps -aq) Remove all images

    docker rmi $(docker images -q)

    0 讨论(0)
  • 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.

    0 讨论(0)
提交回复
热议问题