website/content/blog/autopurgedocker.md

2.1 KiB

title date draft tags medium_enabled
Auto Purge Old Docker Images 2020-09-28T23:30:22-04:00 false
Containers
true

I use Watchtower to automatically update the docker images I use. After leaving it for several months, I've realized that I have been storing over 100GB of old docker images. I needed a way to automatically purge old images and Systemd Timers is the solution.

First it's useful to know the docker command that purges unused images that are older than 24 hours old.

docker image prune -fa --filter "until=24h"

Then we can create a oneshot service file that will describe its dependencies and descriptions for Systemd to manage. This file is /etc/systemd/system/docker-purge.service.

[Unit]
Description=Purge Docker Images Older than 24 Hours
Requires=docker.service
Wants=docker-purge.timer

[Service]
Type=oneshot
ExecStart=/usr/bin/docker image prune -fa --filter "until=24h"

[Install]
WantedBy=multi-user.target

Now we can create the systemd timer that will hook to this service. This is /etc/systemd/system/docker-purge.timer.

[Unit]
Description=Purge Docker Images Older than 24 Hours
Requires=docker-purge.service

[Timer]
Unit=docker-purge.service
OnCalendar=*-*-* 00:00:00
AccuracySec=24h

[Install]
WantedBy=timers.target

This tells Systemd to run the service every day if enabled/started, though not necessarily at midnight. Systemd will schedule a time to run the service within the AccuracySec parameter. That is, it will schedule a time to run sometime everyday.

Finally, let's enable and start the timer.

sudo systemctl enable docker-purge
sudo systemctl start docker-purge

We can check the time that docker-purge is scheduled to run next by asking Systemd to list its timers.

systemctl list-timers

If you want to play around with the OnCalendar parameter. A useful command is

systmed-analyze calendar --iterations=$N "$TIME"

Where you replace $N with an integer, and $TIME with your sample time string.