mirror of
https://github.com/coollabsio/coolify.git
synced 2026-03-11 08:55:47 +00:00
Compare commits
5 commits
9e8cbca333
...
80cedee565
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80cedee565 | ||
|
|
20fcd437c5 | ||
|
|
6a16e71310 | ||
|
|
8cab528551 | ||
|
|
40bf9e22b1 |
5 changed files with 88 additions and 22 deletions
15
app/Actions/Docker/DeleteAllDanglingServerDockerImages.php
Normal file
15
app/Actions/Docker/DeleteAllDanglingServerDockerImages.php
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace App\Actions\Docker;
|
||||
|
||||
use Lorisleiva\Actions\Concerns\AsAction;
|
||||
|
||||
class DeleteAllDanglingServerDockerImages
|
||||
{
|
||||
use AsAction;
|
||||
|
||||
public static function run($server)
|
||||
{
|
||||
return instant_remote_process(["docker image prune --filter dangling=true -f"], $server);
|
||||
}
|
||||
}
|
||||
27
app/Actions/Docker/GetServerDockerImageDetails.php
Normal file
27
app/Actions/Docker/GetServerDockerImageDetails.php
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace App\Actions\Docker;
|
||||
|
||||
use Lorisleiva\Actions\Concerns\AsAction;
|
||||
|
||||
class GetServerDockerImageDetails
|
||||
{
|
||||
use AsAction;
|
||||
|
||||
public static function run($server, $imageId)
|
||||
{
|
||||
$imageDetailsRaw = instant_remote_process(["docker inspect --type=image {$imageId}"], $server);
|
||||
$imageDetails = json_decode($imageDetailsRaw, true);
|
||||
|
||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
||||
return ['error' => 'Invalid JSON returned from Docker inspect', 'raw_output' => $imageDetailsRaw];
|
||||
}
|
||||
|
||||
$containerCountRaw = instant_remote_process(["docker ps -q --filter ancestor={$imageId} | wc -l"], $server);
|
||||
$containerCount = intval(trim($containerCountRaw)); // Convert to an integer
|
||||
|
||||
$imageDetails[0]['ContainerCount'] = $containerCount;
|
||||
|
||||
return $imageDetails;
|
||||
}
|
||||
}
|
||||
|
|
@ -13,25 +13,6 @@ class ListServerDockerImages
|
|||
|
||||
public static function run($server)
|
||||
{
|
||||
|
||||
$jsonString = instant_remote_process(["docker images --format '{{json .}}'"], $server);
|
||||
|
||||
return collect(explode("\n", trim($jsonString)))
|
||||
->filter()
|
||||
->map(function ($line) {
|
||||
$data = json_decode($line, true);
|
||||
if (!$data) return null;
|
||||
|
||||
return [
|
||||
'tag' => $data['Tag'] ?? '<none>',
|
||||
'id' => $data['ID'] ?? '',
|
||||
'created_at' => $data['CreatedAt'] ?? '',
|
||||
'size' => $data['Size'] ?? '',
|
||||
'name' => $data['Repository'] ?? '',
|
||||
];
|
||||
})
|
||||
->filter()
|
||||
->values()
|
||||
->toArray();
|
||||
return format_docker_command_output_to_json(instant_remote_process(["docker images --format '{{json .}}'"], $server));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Actions\Docker\DeleteAllDanglingServerDockerImages;
|
||||
use App\Actions\Docker\GetServerDockerImageDetails;
|
||||
use App\Actions\Docker\ListServerDockerImages;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Server;
|
||||
|
|
@ -26,6 +28,44 @@ class DockerController extends Controller
|
|||
return response()->json(['error' => 'server is not reachable.'], 403);
|
||||
}
|
||||
|
||||
return response()->json(ListServerDockerImages::run($server));
|
||||
return ListServerDockerImages::run($server);
|
||||
}
|
||||
|
||||
public function get_server_docker_image_details($server_uuid, $id)
|
||||
{
|
||||
$query = Server::query();
|
||||
|
||||
$server = $query->where('uuid', $server_uuid)->first();
|
||||
if (!$server) {
|
||||
return response()->json(['error' => 'server not found'], 404);
|
||||
}
|
||||
|
||||
$isReachable = (bool) $server->settings->is_reachable;
|
||||
// If the server is reachable, send the reachable notification if it was sent before
|
||||
if ($isReachable !== true) {
|
||||
return response()->json(['error' => 'server is not reachable.'], 403);
|
||||
}
|
||||
|
||||
return response()->json(GetServerDockerImageDetails::run($server, $id));
|
||||
}
|
||||
|
||||
public function delete_all_dangling_server_docker_images($server_uuid)
|
||||
{
|
||||
$query = Server::query();
|
||||
|
||||
$server = $query->where('uuid', $server_uuid)->first();
|
||||
if (!$server) {
|
||||
return response()->json(['error' => 'server not found'], 404);
|
||||
}
|
||||
|
||||
$isReachable = (bool) $server->settings->is_reachable;
|
||||
// If the server is reachable, send the reachable notification if it was sent before
|
||||
if ($isReachable !== true) {
|
||||
return response()->json(['error' => 'server is not reachable.'], 403);
|
||||
}
|
||||
|
||||
$message = DeleteAllDanglingServerDockerImages::run($server);
|
||||
|
||||
return response()->json(['message' => $message]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -130,10 +130,13 @@ Route::group([
|
|||
Route::match(['get', 'post'], '/services/{uuid}/restart', [ServicesController::class, 'action_restart'])->middleware([IgnoreReadOnlyApiToken::class]);
|
||||
Route::match(['get', 'post'], '/services/{uuid}/stop', [ServicesController::class, 'action_stop'])->middleware([IgnoreReadOnlyApiToken::class]);
|
||||
|
||||
Route::get('/docker/images/{server_uuid}', [DockerController::class, 'list_server_docker_images']);
|
||||
Route::get('/docker/{server_uuid}/images', [DockerController::class, 'list_server_docker_images']);
|
||||
Route::get('/docker/{server_uuid}/image/{id}', [DockerController::class, 'get_server_docker_image_details']);
|
||||
Route::delete('/docker/{server_uuid}/images/delete/dangling', [DockerController::class, 'delete_all_dangling_server_docker_images']);
|
||||
});
|
||||
|
||||
|
||||
|
||||
Route::group([
|
||||
'prefix' => 'v1',
|
||||
], function () {
|
||||
|
|
|
|||
Loading…
Reference in a new issue