Skip to content

Instantly share code, notes, and snippets.

@mlebkowski
Last active November 13, 2023 20:14
Show Gist options
  • Save mlebkowski/471d2731176fb11e81aa to your computer and use it in GitHub Desktop.
Save mlebkowski/471d2731176fb11e81aa to your computer and use it in GitHub Desktop.
Cleanup docker disk space https://lebkowski.name/docker-volumes/
#!/bin/bash
# remove exited containers:
docker ps --filter status=dead --filter status=exited -aq | xargs -r docker rm -v
# remove unused images:
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi
# remove unused volumes:
find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(
docker ps -aq | xargs docker inspect | jq -r '.[] | .Mounts | .[] | .Name | select(.)'
) | xargs -r rm -fr
@danstreeter
Copy link

Hey - Found this on your site and it really helped me out - thanks, however I think you can deal with the unused volumes with inbuilt commands instead of drilling through your filesystem with a complex command:

docker volume ls -f dangling=true | awk '{ print $2 }' | xargs docker volume rm

@mlebkowski
Copy link
Author

@danstreeter, yep, this is just a part of the blog post where I mentioned the solution you posted. This is, however, only for docker version 1.9 and later

@Shuliyey
Copy link

Shuliyey commented Jan 23, 2017

thanks for the script, it's great 😄

I've updated the remove unused images part a bit

#!/bin/bash

# remove exited containers:
docker ps --filter status=dead --filter status=exited -aq | xargs -r docker rm -v

# remove unused images:
local images=`docker images --no-trunc`;
local lines=$(echo "$images" | awk '{print $2}' | grep -n "<none>" | cut -d: -f1 | sed 's/$/p/g');
lines=`echo $lines`;
lines=${lines// /;};
local image_ids=$(echo "$images" | awk '{print $3}' | sed -n "$lines");
[[ -n "${image_ids[@]}" ]] && docker rmi ${image_ids[@]}

# remove unused volumes:
find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(
  docker ps -aq | xargs docker inspect | jq -r '.[] | .Mounts | .[] | .Name | select(.)'
) | xargs -r rm -fr

@zaplatynski
Copy link

zaplatynski commented Jan 5, 2018

Since the latest docker version there are special prune commands:

#!/bin/bash
# remove exited containers:
docker ps --filter status=dead --filter status=exited -aq | xargs -r docker rm -v
# remove unused containers:
yes | docker container prune
# remove unused images:
yes | docker image prune
# remove unused volumes:
yes | docker volume prune

@jc00ke
Copy link

jc00ke commented Jul 16, 2018

@zaplatynski 👏 🎉

@givankin
Copy link

As of today, all prune commands were merged into single docker system prune: https://docs.docker.com/engine/reference/commandline/system_prune/#examples

@Qix-
Copy link

Qix- commented Oct 21, 2018

Which is a terrible design choice because it unknowingly purges just about everything useful to use Docker by default, which causes a ton of development overhead helping colleagues recover network configuration, etc. when simply trying to free up space on the system.

Docker seems to mess up just about everything they do.

@alexsmredman
Copy link

alexsmredman commented Dec 16, 2020

Where is the updates Lebkowski?! Where is the updates?!!!!

image

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