mirror of
https://github.com/tiennm99/coolify.git
synced 2026-04-17 17:21:04 +00:00
Fix: Prevent coolify-helper and coolify-realtime images from being pruned
Current version of infrastructure images (coolify-helper, coolify-realtime) are now protected from deletion during docker cleanup, regardless of which registry they're pulled from (ghcr.io, docker.io, or Docker Hub implicit). Old versions continue to be cleaned up as intended. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -251,3 +251,92 @@ it('correctly excludes Docker Compose images from general prune', function () {
|
||||
expect(preg_match($pattern, $image))->toBe(0, "Image {$image} should be deletable");
|
||||
}
|
||||
});
|
||||
|
||||
it('excludes current version of Coolify infrastructure images from any registry', function () {
|
||||
// Test the regex pattern used to protect the current version of infrastructure images
|
||||
// regardless of which registry they come from (ghcr.io, docker.io, or no prefix)
|
||||
$helperVersion = '1.0.12';
|
||||
$realtimeVersion = '1.0.10';
|
||||
|
||||
// Build the exclusion pattern the same way CleanupDocker does
|
||||
// Pattern: (^|/)coollabsio/coolify-helper:VERSION$|(^|/)coollabsio/coolify-realtime:VERSION$
|
||||
$escapedHelperVersion = preg_replace('/([.\\\\+*?\[\]^$(){}|])/', '\\\\$1', $helperVersion);
|
||||
$escapedRealtimeVersion = preg_replace('/([.\\\\+*?\[\]^$(){}|])/', '\\\\$1', $realtimeVersion);
|
||||
|
||||
// For PHP preg_match, escape forward slashes
|
||||
$infraPattern = "(^|\\/)coollabsio\\/coolify-helper:{$escapedHelperVersion}$|(^|\\/)coollabsio\\/coolify-realtime:{$escapedRealtimeVersion}$";
|
||||
$pattern = "/{$infraPattern}/";
|
||||
|
||||
// Current versioned infrastructure images from ANY registry should be PROTECTED
|
||||
$protectedImages = [
|
||||
// ghcr.io registry
|
||||
"ghcr.io/coollabsio/coolify-helper:{$helperVersion}",
|
||||
"ghcr.io/coollabsio/coolify-realtime:{$realtimeVersion}",
|
||||
// docker.io registry (explicit)
|
||||
"docker.io/coollabsio/coolify-helper:{$helperVersion}",
|
||||
"docker.io/coollabsio/coolify-realtime:{$realtimeVersion}",
|
||||
// No registry prefix (Docker Hub implicit)
|
||||
"coollabsio/coolify-helper:{$helperVersion}",
|
||||
"coollabsio/coolify-realtime:{$realtimeVersion}",
|
||||
];
|
||||
|
||||
// Verify current infrastructure images ARE protected from any registry
|
||||
foreach ($protectedImages as $image) {
|
||||
expect(preg_match($pattern, $image))->toBe(1, "Current infrastructure image {$image} should be protected");
|
||||
}
|
||||
|
||||
// Verify OLD versions of infrastructure images are NOT protected (can be deleted)
|
||||
$oldVersionImages = [
|
||||
'ghcr.io/coollabsio/coolify-helper:1.0.11',
|
||||
'docker.io/coollabsio/coolify-helper:1.0.10',
|
||||
'coollabsio/coolify-helper:1.0.9',
|
||||
'ghcr.io/coollabsio/coolify-realtime:1.0.9',
|
||||
'ghcr.io/coollabsio/coolify-helper:latest',
|
||||
'coollabsio/coolify-realtime:latest',
|
||||
];
|
||||
|
||||
foreach ($oldVersionImages as $image) {
|
||||
expect(preg_match($pattern, $image))->toBe(0, "Old infrastructure image {$image} should NOT be protected");
|
||||
}
|
||||
|
||||
// Verify other images are NOT protected (can be deleted)
|
||||
$deletableImages = [
|
||||
'nginx:alpine',
|
||||
'postgres:15',
|
||||
'redis:7',
|
||||
'mysql:8.0',
|
||||
'node:20',
|
||||
];
|
||||
|
||||
foreach ($deletableImages as $image) {
|
||||
expect(preg_match($pattern, $image))->toBe(0, "Image {$image} should NOT be protected");
|
||||
}
|
||||
});
|
||||
|
||||
it('protects current infrastructure images from any registry even when no applications exist', function () {
|
||||
// When there are no applications, current versioned infrastructure images should still be protected
|
||||
// regardless of which registry they come from
|
||||
$helperVersion = '1.0.12';
|
||||
$realtimeVersion = '1.0.10';
|
||||
|
||||
// Build the pattern the same way CleanupDocker does
|
||||
$escapedHelperVersion = preg_replace('/([.\\\\+*?\[\]^$(){}|])/', '\\\\$1', $helperVersion);
|
||||
$escapedRealtimeVersion = preg_replace('/([.\\\\+*?\[\]^$(){}|])/', '\\\\$1', $realtimeVersion);
|
||||
|
||||
// For PHP preg_match, escape forward slashes
|
||||
$infraPattern = "(^|\\/)coollabsio\\/coolify-helper:{$escapedHelperVersion}$|(^|\\/)coollabsio\\/coolify-realtime:{$escapedRealtimeVersion}$";
|
||||
$pattern = "/{$infraPattern}/";
|
||||
|
||||
// Verify current infrastructure images from any registry are protected
|
||||
expect(preg_match($pattern, "ghcr.io/coollabsio/coolify-helper:{$helperVersion}"))->toBe(1);
|
||||
expect(preg_match($pattern, "docker.io/coollabsio/coolify-helper:{$helperVersion}"))->toBe(1);
|
||||
expect(preg_match($pattern, "coollabsio/coolify-helper:{$helperVersion}"))->toBe(1);
|
||||
expect(preg_match($pattern, "ghcr.io/coollabsio/coolify-realtime:{$realtimeVersion}"))->toBe(1);
|
||||
|
||||
// Old versions should NOT be protected
|
||||
expect(preg_match($pattern, 'ghcr.io/coollabsio/coolify-helper:1.0.11'))->toBe(0);
|
||||
expect(preg_match($pattern, 'docker.io/coollabsio/coolify-helper:1.0.11'))->toBe(0);
|
||||
|
||||
// Other images should not be protected
|
||||
expect(preg_match($pattern, 'nginx:alpine'))->toBe(0);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user