Doing a bit of Docker Cleanup
Every once in a while I clean up everything I created in Docker - containers, images, volumes, and the build cache.
To see how much you have stored run docker system df
-
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 6 2 2.156GB 498.9MB (23%)
Containers 2 0 176.7MB 176.7MB (100%)
Local Volumes 7 1 20.63MB 20.63MB (99%)
Build Cache 127 0 2.984GB 2.984GB
All in one
Below I show how to clean out resources one by one, but a quick way to get rid of a lot quickly is to use -
docker system prune
- this will remove all unused images, containers, volumes, and build cache.
Or docker system prune -a
, to delete more aggressively. Running both commands will tell you what is going to happen.
Images
To clean out the images run docker image prune
, this will delete images any that are not is use - those that don’t have other images dependant on them, or containers that use them. But you will likely have some that remain.
If you want to delete all images, irrespective of dependencies, run docker image prune -a
.
To see what is left behind, run docker image ls
.
For these ones run, docker image rim imageId
, and that will clear some of them one by one, but now you will start getting the below error or something similar -
Error response from daemon: conflict: unable to delete 9033d236230a (cannot be forced) - image is being used by running container 0f6d7768b45f
In that case, you should stop, and delete the container. Then try deleting the images again.
Another error is -
Error response from daemon: conflict: unable to delete ea25002095c5 (cannot be forced) - image has dependent child images
For these you have to figure out what image is the dependent one and delete that, or nuke the whole lot (but you probably have to run it a few times) -
for imageId in $(docker image ls --format '{{.ID}}'); do docker image rm -f $imageId; done
Containers
To clean out containers, start with docker container prune
.
You can run docker container ls --all
and then delete one by one, or run the below to wipe them all out -
for containerId in $(docker container ls --all --format '{{.ID}}'); do docker container rm $containerId; done
You might get some errors like -
Error response from daemon: You cannot remove a running container b4f0221e230347317147b485daa4b08740bd06b4cd217347fa7f3c351f25a73f. Stop the container before attempting removal or force remove
You can either stop the container or add the --force
flag to the above command.
Volume
To clear out the volumes, run docker volume prune
.
Build Cache
And finally, to clear out the cache run docker builder prune
.
Or more aggressively docker builder prune -a
This can be useful when you want to clear out layers for an image that is used to build something.
Clean
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 0 0 0B 0B
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
There, nice and clean!