···
1
+
{ config, pkgs, ... }:
4
+
systemd.services.docker-cleanup = {
5
+
description = "Docker cleanup service - removes unused containers, networks, images, and volumes";
10
+
ExecStart = pkgs.writeShellScript "docker-cleanup" ''
13
+
echo "Starting Docker cleanup at $(date)"
15
+
# remove containers running for 15+ minutes
16
+
echo "Removing containers running for 15+ minutes..."
17
+
CONTAINERS_TO_REMOVE=$(${pkgs.docker}/bin/docker ps --format "table {{.ID}}\t{{.RunningFor}}" --no-trunc | awk '
19
+
if ($2 >= 15) print $1
38
+
if [ -n "$CONTAINERS_TO_REMOVE" ]; then
39
+
echo "Found containers to remove: $CONTAINERS_TO_REMOVE"
40
+
echo "$CONTAINERS_TO_REMOVE" | xargs -r ${pkgs.docker}/bin/docker rm -f
42
+
echo "No containers running for 15+ minutes found"
45
+
# remove stopped containers
46
+
echo "Removing stopped containers..."
47
+
${pkgs.docker}/bin/docker container prune -f || true
49
+
# remove unused networks (excluding default networks)
50
+
echo "Removing unused networks..."
51
+
${pkgs.docker}/bin/docker network prune -f || true
53
+
# remove unused images (dangling images only by default)
54
+
echo "Removing dangling images..."
55
+
${pkgs.docker}/bin/docker image prune -f || true
57
+
# remove unused volumes
58
+
echo "Removing unused volumes..."
59
+
${pkgs.docker}/bin/docker volume prune -f || true
61
+
echo "Docker cleanup completed at $(date)"
64
+
PrivateNetwork = false; # Needs network access for Docker
65
+
ProtectSystem = "strict";
67
+
NoNewPrivileges = true;
70
+
StandardOutput = "journal";
71
+
StandardError = "journal";
74
+
# ensure docker is running before cleanup
75
+
after = [ "docker.service" ];
76
+
requires = [ "docker.service" ];
78
+
# don't restart on failure
79
+
restartIfChanged = false;
82
+
# timer to run the cleanup service every n minutes
83
+
systemd.timers.docker-cleanup = {
84
+
description = "Timer for Docker cleanup service";
86
+
OnCalendar = "*:0/15"; # run every 15 minutes
87
+
Persistent = true; # persist timer across reboots
88
+
WakeSystem = false; # run immediately if the system was powered off when timer should have run
90
+
wantedBy = [ "timers.target" ];
93
+
virtualisation.docker.enable = true;