All checks were successful
Auto Tag Develop / tag (push) Successful in 6s
Reviewed-on: #1 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
101 lines
2.6 KiB
PHP
101 lines
2.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Service;
|
|
|
|
use Symfony\Component\Process\Process;
|
|
|
|
final class DockerService
|
|
{
|
|
/**
|
|
* @return array{status: string, image: string, version: string, startedAt: string}
|
|
*/
|
|
public function getContainerStatus(string $containerName): array
|
|
{
|
|
$process = new Process([
|
|
'docker', 'inspect',
|
|
'--format', '{{.State.Status}}||{{.Config.Image}}||{{.State.StartedAt}}',
|
|
$containerName,
|
|
]);
|
|
$process->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], '%'),
|
|
];
|
|
}
|
|
}
|