What Does the "docker system prune" Command Do?

Introduced in Docker v1.25, the docker system prune command removes all:

  • stopped containers;
  • networks not used by at least one container;
  • dangling images;
  • build cache.

Additionally, you can pass some flags to the command to do the following:

Remove All Unused Volumes

By default, the docker system prune command does not prune unused volumes (to prevent loss of important data). However, you can use the --volumes option to remove volume(s) that are not used by at least one container:

docker system prune --volumes

# WARNING! This will remove:
#  - all stopped containers
#  - all networks not used by at least one container
#  - all volumes not used by at least one container
#  - all dangling images
#  - all dangling build cache

Remove All Unused Images

You can use the --all (or -a shorthand) option, to remove all unused images (not just the dangling ones):

docker system prune -a

# WARNING! This will remove:
#  - all stopped containers
#  - all networks not used by at least one container
#  - all images without at least one container associated to them
#  - all build cache

Remove Without Displaying Confirmation Prompt

By default, the docker system prune command shows a confirmation prompt before pruning. If you don't want to see the confirmation prompt, then you can use the --force (or -f shorthand) option:

docker system prune -f

Remove Containers, Images, Networks, and Volumes Based on a Filter

Introduced in Docker v1.28, you can use the --filter option to specify which containers, images, networks, and volumes are removed. You may specify multiple filter options. Following options are supported currently:

  1. until=<timestamp> — removes containers, images, networks, and volumes until the specified Unix timestamps, date formatted timestamps, or Go duration strings;
  2. label=... — removes containers, images, networks, and volumes with the specified labels;
  3. label!=... — removes containers, images, networks, and volumes without the specified labels;

When using the until=... filter, the local timezone on the daemon will be used unless either a Z or a +-00:00 timezone offset is specified at the end of the timestamp.

Examples:

To prune all containers, images, networks, and volumes older than 24h, you can do the following:

docker system prune --filter "until=24h"

# WARNING! This will remove:
#  - all stopped containers
#  - all networks not used by at least one container
#  - all dangling images
#  - all dangling build cache

# Items to be pruned will be filtered with:
#  - until=24h

To prune all containers, images, networks, and volumes with the label "foo", you can do the following:

docker system prune --filter "label=foo"

# WARNING! This will remove:
#  - all stopped containers
#  - all networks not used by at least one container
#  - all dangling images
#  - all dangling build cache

# Items to be pruned will be filtered with:
#  - label=foo

To containers, images, networks, and volumes that do not have the label "foo", you can do the following:

docker system prune --filter "label!=foo"

# WARNING! This will remove:
#  - all stopped containers
#  - all networks not used by at least one container
#  - all dangling images
#  - all dangling build cache

# Items to be pruned will be filtered with:
#  - label!=foo

This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.