I’ve been playing around with Docker a lot lately and the number of images on my host keeps climbing. In doing so, I’ve managed to end up with a number of images which weren’t properly named/tagged and I really have no idea what they’re for at this point. Oh, sure, I could always just do a
docker inspect image_id
on the image and see what it is, but I’m lazy. It’s easier just to get rid of them. 🙂
So if I use ‘docker images’ to see what I have available you can see I’ve got a number of images in the state I describe.
REPOSITORY TAG IMAGE ID CREATED SIZE runlevl4/couch latest c0d143528267 19 hours ago 573MB runlevl4/openjdk latest 1a04169be1f0 20 hours ago 738MB runlevl4/alpine-wso2 latest 382b74b4df93 11 days ago 757MB <none> <none> 2fbbf4f7f2ae 11 days ago 757MB runlevl4/alpine-wso2 v1 581ac302a5e7 11 days ago 757MB <none> <none> 3c2bd15fa447 11 days ago 757MB centos7/nonroot v1 03f554e67899 13 days ago 197MB <none> <none> e876350b9c92 13 days ago 197MB
Here’s a quick and easy way to get rid of them. First, we’ll do a dry run and just return the images we want to purge.
docker images | grep "<none>" | tr -s " " | cut -d " " -f 3
docker images – returns all the images on our host
grep “
tr -s ” ” – this is a fun one. the -s argument tells tr to replace all of the spaces with a single space
cut -d ” ” -f 3 – we use cut to reduce the results to just the image id. -d sets the delimiter as a single space and -f grabs the third field
Let’s see some examples as we build the command out.
docker images | grep "<none>" <none> <none> 2fbbf4f7f2ae 11 days ago 757MB <none> <none> 3c2bd15fa447 11 days ago 757MB <none> <none> e876350b9c92 13 days ago 197MB
Now we throw in the tr command.
docker images | grep "<none>" | tr -s " " <none> <none> 2fbbf4f7f2ae 11 days ago 757MB <none> <none> 3c2bd15fa447 11 days ago 757MB <none> <none> e876350b9c92 13 days ago 197MB
And finally, we return just the image id.
docker images | grep "<none>" | tr -s " " | cut -d " " -f 3 2fbbf4f7f2ae 3c2bd15fa447 e876350b9c92
Now that we know our command is working, we can pass it as an argument to the
docker rmi
command. ‘docker rmi’ is the CLI command to remove one or more Docker images.
docker rmi $(docker images | grep "<none>" | tr -s " " | cut -d " " -f 3) Deleted: sha256:2fbbf4f7f2aef4d47d74a44ec32fe2cf8d3fd4650b7d216675908f3757651b21 Deleted: sha256:3c2bd15fa447d9e5ffd12e8d149147fb5dd66cb48c9f152748b42514abcaf5a1 Deleted: sha256:84243c17c3cf36e418afe44880b33490f537e91b81ef9ac78a3d345e6a7609b0 Deleted: sha256:e876350b9c92fce722c096ef989216f802b264276676219cc2f321ff279d5ba5
Now you can use
docker images
again to confirm that they’re gone.
REPOSITORY TAG IMAGE ID CREATED SIZE runlevl4/couch latest c0d143528267 19 hours ago 573MB runlevl4/openjdk latest 1a04169be1f0 20 hours ago 738MB runlevl4/alpine-wso2 latest 382b74b4df93 11 days ago 757MB runlevl4/alpine-wso2 v1 581ac302a5e7 11 days ago 757MB centos7/nonroot v1 03f554e67899 13 days ago 197MB