How to automatically remove docker images that are not associated to a container daily
Note: This will not only remove docker images without a tag but all docker images not associated to a running or stopped container. See our previous post How to automatically cleanup (prune) docker images daily in case this is not the desired behaviour.
docker image prune
provides an easy way to remove “unused” docker images from a system and hence fixes or significantly delays docker eating up all your disk space on e.g. automated disk space.
I created a systemd-timer based daily image removal routine using TechOverflow’s Simple systemd timer generator.
Quick install using
wget -qO- https://techoverflow.net/scripts/install-cleanup-docker-all.sh | sudo bash
This is the script which automatically creates & installs both systemd config files.
#!/bin/sh
# This script installs automated docker cleanup.
# onto systemd-based systems.
# See https://techoverflow.net/2020/02/04/how-to-remove-all-docker-images-that-are-not-associated-to-a-container/
# for details on what images are removed.
# It requires that docker is installed properly
cat >/etc/systemd/system/PruneDockerAll.service <<EOF
[Unit]
Description=PruneDockerAll
[Service]
Type=oneshot
ExecStart=/bin/bash -c "docker image ls --format '{{.ID}}' | xargs docker image rm ; true"
WorkingDirectory=/tmp
EOF
cat >/etc/systemd/system/PruneDockerAll.timer <<EOF
[Unit]
Description=PruneDockerAll
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
EOF
# Enable and start service
systemctl enable PruneDockerAll.timer && sudo systemctl start PruneDockerAll.timer
To view the logs, use
journalctl -xfu PruneDockerAll.service
To view the status, use
sudo systemctl status PruneDockerAll.timer
To immediately cleanup your docker images, use
sudo systemctl start PruneDockerAll.service