Cleaning Up After Docker

Have you been running and re-running docker-compose lately? If you’re using Docker for development purposes, you’re running lots of containers, building new images and probably have a chunk of space on your disk which is occupied by stuff you don’t need.

Just chucking along, and not doing anything about it, will soon see your root directory fill up 99% of your available space. Weird things tend to happen when you max out your capacity - here’s what you need to do to clean up after Docker.

Use these with caution! If you have any valuable data dangling around in Docker containers:

  • Mount local directories for important data.
  • Back up your volumes.
  • Shame on you.

The stuff which is taking up most space, are old images (previous builds), stopped containers and their volumes.

Docker Compose

If you just want to clean up the data of a particular docker-compose stack, run

$ docker-compose down -v --rmi all --remove-orphans

This will take care of taking down the volumes, images and dangling stuff. Anyway, you might wannt to look into the following as well.

Getting a List of Offenders

docker ps -a -q is your friend. It lists all container identifiers, and only them in a nice list. The same goes for docker images -q - all image identifiers just for you. Regarding volumes, docker volume ls -q is your friend.

Fall most commands, you can pass on a list of ids to perform the operation on. This happens with the bash notation $(command), which executes a command and insers its output into the place it occupies.

Cleaning Up

The following commands will take care of your mess. Once again, make sure you’re not removing stuff you might miss later on. Take heed. The last command for example, will remove volumes related to docker-compose stacks if the containers are down. That’s usually NOT what you want to do.

The -f arguments help to reduce the number of warnings you get (upon trying to remove a running container for example) and make the intentions clearer. If you want to just remove all images for example, just leave out the -f argument when getting a list of images.

$ docker rm -v $(docker ps -aq -f 'status=exited')
$ docker rmi $(docker images -aq -f 'dangling=true')

# ATTENTION: this will also remove volumes of docker-compose if the containers are barely stopped
$ docker volume rm $(docker volume ls -q -f 'dangling=true')

Since Version 1.25

A new change came along, which hugely simplifies the above operations, and reduces them to one single command.

$ docker system prune

This will remove all unused containers, volumes, networks and images (both dangling and unreferenced).

If you’d like more control than the above, you can limit the pruning down to a single part, like the images, by issuing something like:

$ docker image prune

Happy Dockering!

Subscribe to my newsletter!
You'll get notified via e-mail when new articles are published. I mostly write about Docker, Kubernetes, automation and building stuff on the web. Sometimes other topics sneak in as well.

Your e-mail address will be used to send out summary emails about new articles, at most weekly. You can unsubscribe from the newsletter at any time.

Für den Versand unserer Newsletter nutzen wir rapidmail. Mit Ihrer Anmeldung stimmen Sie zu, dass die eingegebenen Daten an rapidmail übermittelt werden. Beachten Sie bitte auch die AGB und Datenschutzbestimmungen .

vsupalov.com

© 2024 vsupalov.com. All rights reserved.