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], '%'), ]; } }