Skip to content

Instantly share code, notes, and snippets.

@mlebkowski
Last active March 15, 2026 02:27
Show Gist options
  • Select an option

  • Save mlebkowski/471d2731176fb11e81aa to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

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
Copy Markdown
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

Shuliyey commented Jan 23, 2017

Copy link
Copy Markdown

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

zaplatynski commented Jan 5, 2018

Copy link
Copy Markdown

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

jc00ke commented Jul 16, 2018

Copy link
Copy Markdown

@zaplatynski πŸ‘ πŸŽ‰

@givankin

Copy link
Copy Markdown

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

@Qix-

Qix- commented Oct 21, 2018

Copy link
Copy Markdown

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

alexsmredman commented Dec 16, 2020

Copy link
Copy Markdown

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