From dfba8e3993aa93bff98c294fd169ddd74296b362 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Sat, 20 Jul 2024 17:23:03 +0200 Subject: [PATCH] Command to cleanup docker images (#495) * add command to cleanup docker images * automatically cleanup images daily * fix request * fix empty check * run pint --- .../Maintenance/PruneImagesCommand.php | 60 +++++++++++++++++++ app/Console/Kernel.php | 3 + 2 files changed, 63 insertions(+) create mode 100644 app/Console/Commands/Maintenance/PruneImagesCommand.php diff --git a/app/Console/Commands/Maintenance/PruneImagesCommand.php b/app/Console/Commands/Maintenance/PruneImagesCommand.php new file mode 100644 index 000000000..23f613fa3 --- /dev/null +++ b/app/Console/Commands/Maintenance/PruneImagesCommand.php @@ -0,0 +1,60 @@ +argument('node'); + + if (empty($node)) { + $nodes = Node::all(); + /** @var Node $node */ + foreach ($nodes as $node) { + $this->cleanupImages($node); + } + } else { + $this->cleanupImages((int) $node); + } + } + + private function cleanupImages(int|Node $node): void + { + if (!$node instanceof Node) { + $node = Node::query()->findOrFail($node); + } + + try { + $response = Http::daemon($node) + ->connectTimeout(5) + ->timeout(30) + ->delete('/api/system/docker/image/prune') + ->json() ?? []; + + if (empty($response) || $response['ImagesDeleted'] === null) { + $this->warn("Node {$node->id}: No images to clean up."); + + return; + } + + $count = count($response['ImagesDeleted']); + + $useBinaryPrefix = config('panel.use_binary_prefix'); + $space = round($useBinaryPrefix ? $response['SpaceReclaimed'] / 1024 / 1024 : $response['SpaceReclaimed'] / 1000 / 1000, 2) . ($useBinaryPrefix ? ' MiB' : ' MB'); + + $this->info("Node {$node->id}: Cleaned up {$count} dangling docker images. ({$space})"); + } catch (Exception $exception) { + $this->error($exception->getMessage()); + } + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 5b8505970..4a9bbee17 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -10,6 +10,7 @@ use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use App\Console\Commands\Schedule\ProcessRunnableCommand; use App\Console\Commands\Maintenance\PruneOrphanedBackupsCommand; use App\Console\Commands\Maintenance\CleanServiceBackupFilesCommand; +use App\Console\Commands\Maintenance\PruneImagesCommand; class Kernel extends ConsoleKernel { @@ -31,7 +32,9 @@ class Kernel extends ConsoleKernel // Execute scheduled commands for servers every minute, as if there was a normal cron running. $schedule->command(ProcessRunnableCommand::class)->everyMinute()->withoutOverlapping(); + $schedule->command(CleanServiceBackupFilesCommand::class)->daily(); + $schedule->command(PruneImagesCommand::class)->daily(); $schedule->job(new NodeStatistics())->everyFiveSeconds()->withoutOverlapping();