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
[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
[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.
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.