Skip to content

Instantly share code, notes, and snippets.

Last active April 3, 2023 08:23
Show Gist options
  • Save eduardocardoso/82a629882ddb02ab3677 to your computer and use it in GitHub Desktop.
Save eduardocardoso/82a629882ddb02ab3677 to your computer and use it in GitHub Desktop.
Script to delete exited containers and untagged/unused images from docker
set -o errexit
echo "Removing exited docker containers..."
docker ps -a -f status=exited -q | xargs -r docker rm -v
echo "Removing dangling images..."
docker images --no-trunc -q -f dangling=true | xargs -r docker rmi
echo "Removing unused docker images"
images=($(docker images --digests | tail -n +2 | awk '{ img_id=$1; if($2!="<none>")img_id=img_id":"$2; if($3!="<none>") img_id=img_id"@"$3; print img_id}'))
containers=($(docker ps -a | tail -n +2 | awk '{print $2}'))
containers_reg=" ${containers[*]} "
for item in ${images[@]}; do
if [[ ! $containers_reg =~ " $item " ]]; then
remove_images=" ${remove[*]} "
echo ${remove_images} | xargs -r docker rmi
echo "Done"
Copy link

git-j commented Apr 26, 2015

removes 'all' images and outputs docker usage when running again
script ran while all containers where stopped, correct but surprising behavior.

Copy link

It probably shows docker usage when running again because it tries to remove an empty set of containers and/or images. It's harmless but can be improved by adding a simple check

Copy link

I improved the error handling and behavior when there is nothing to remove, now it runs cleanly under a cron manager like 'cronic':

Copy link

This script removes "Data Volume Containers" ( - they are picked up by that "status=exited" filter even though they were never started. Docker bug?

Anyhow, I amended the script to exclude containers named "*-data" in my fork:

Copy link

I get errors, the script tried to remove images in use, the don't check if an image is in use before try to remove? Thank you.

Removing unused docker images
Error response from daemon: Conflict, cannot delete 91e54dfb1179 because the running container 4960a1706ac3 is using it, stop it and use -f to force
Error: failed to remove images: [ubuntu:14.04]

Copy link

@rafaelcapucho It is probably because the container was started without providing a tag, the check that this script does is simply concatenating all images with tags and removing the ones that are not shown by docker ps.
So if there is a container running the latest tag of an image without specifying its tag this script will not detect it as running and will try to remove the image.

Copy link

Dufgui commented Dec 16, 2015

Thanks a lot!
I improve the image id list by manage none tag and use digest

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment