diff --git a/src/Service/DockerService.php b/src/Service/DockerService.php new file mode 100644 index 0000000..896bc38 --- /dev/null +++ b/src/Service/DockerService.php @@ -0,0 +1,100 @@ +setTimeout(10); + $process->run(); + + if (!$process->isSuccessful()) { + return [ + 'status' => 'not_found', + 'image' => '', + 'version' => '', + 'startedAt' => '', + ]; + } + + $parts = explode('||', trim($process->getOutput())); + + if (\count($parts) < 3) { + return [ + 'status' => 'not_found', + 'image' => '', + 'version' => '', + 'startedAt' => '', + ]; + } + + $image = $parts[1]; + $version = 'latest'; + if (str_contains($image, ':')) { + $version = substr($image, strrpos($image, ':') + 1); + } + + return [ + 'status' => $parts[0], + 'image' => $image, + 'version' => $version, + 'startedAt' => $parts[2], + ]; + } + + /** + * @return array{cpuPercent: float, memoryUsage: string, memoryLimit: string, memoryPercent: float} + */ + public function getContainerStats(string $containerName): array + { + $process = new Process([ + 'docker', 'stats', '--no-stream', + '--format', '{{.CPUPerc}}||{{.MemUsage}}||{{.MemPerc}}', + $containerName, + ]); + $process->setTimeout(10); + $process->run(); + + if (!$process->isSuccessful()) { + return [ + 'cpuPercent' => 0.0, + 'memoryUsage' => '', + 'memoryLimit' => '', + 'memoryPercent' => 0.0, + ]; + } + + $parts = explode('||', trim($process->getOutput())); + + if (\count($parts) < 3) { + return [ + 'cpuPercent' => 0.0, + 'memoryUsage' => '', + 'memoryLimit' => '', + 'memoryPercent' => 0.0, + ]; + } + + $memParts = explode(' / ', $parts[1]); + + return [ + 'cpuPercent' => (float) rtrim($parts[0], '%'), + 'memoryUsage' => $memParts[0] ?? '', + 'memoryLimit' => $memParts[1] ?? '', + 'memoryPercent' => (float) rtrim($parts[2], '%'), + ]; + } +}