'Docker image Prune Filtering
Currently I am running
while true; do
docker system prune --all -f;
sleep 6400;
done
In a daemonset to remove older images in my containers.
There is some unused images that I still want to keep around. Is there a possibility to filter out some images to not be pruned by this command?
for example after running docker system prune command,the following should not change if I want to prune everything else except repository a
Repository TAG IMAGE_ID CREATED SIZE
a 12dac 3eadf now 1
a 44rfd 233df 4 month ago 1
Thanks.
Solution 1:[1]
You can add regular expression filters to prevent certain containers from pruning.
filtered=$(docker image prune –filter name=foo* -aq)
docker rm $filtered
This will delete all except containers that begin with the letters foo.
If necessary, you can read about the additional keys you can use for filtering in the docs
Solution 2:[2]
docker images --format "{{.Repository}}:{{.Tag}}:{{.ID}}" | grep "what_you_need" | cut -f 3 -d ":" | xargs docker rmi
works for single "what_you_need" image. Look at the example:
docker images --format "{{.Repository}}:{{.Tag}}:{{.ID}}" | grep "prom/prometheus:v2.32.1" | cut -f 3 -d ":" | xargs docker rmi
Solution 3:[3]
From the docs on filter, adding a label to the bottom of your docker image will allow you to group your images.
For example, you could create a label in your dockerfile called storage and set its value to do_not_delete for the images you want to keep:
LABEL storage="do_not_delete"
Then run docker build ... to apply this label to the image.
Now, in your script, you can prune all images where the label storage isn't explicitly set to do_not_delete. Here is a sample command:
docker image prune --all -f --filter label!=storage="do_not_delete"
EXTRA
We can chain these filters too. In this example we prune all images older than one hour, while respecting the do_not_delete label:
docker image prune --all -f --filter label!=storage="do_not_delete" --filter until=1h
This can also be useful for clean up images you're actively developing against and/or testing. I use the command below to remove clutter in my dev environment:
# assuming all the images I'm working against have this line
LABEL env="scratch"
docker image prune --all --filter label=env="scratch" --filter until=1h
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | justahuman |
| Solution 2 | Oleksii Radetskyi |
| Solution 3 | mts |
