feat : display container port mappings in environment health
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled

Extract exposed ports from docker inspect and show them as badges (hostPort:containerPort)
in the environment health section.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-04-08 11:27:46 +02:00
parent 123d9b306f
commit ab2b3fd9ef
6 changed files with 52 additions and 4 deletions

View File

@@ -23,7 +23,7 @@ final class DockerService
}
/**
* @return array{status: string, image: string, version: string, startedAt: string}
* @return array{status: string, image: string, version: string, startedAt: string, ports: list<array{hostPort: string, containerPort: string, protocol: string}>}
*/
public function getContainerStatus(string $containerName): array
{
@@ -33,12 +33,13 @@ final class DockerService
'image' => '',
'version' => '',
'startedAt' => '',
'ports' => [],
];
}
$process = new Process([
'docker', 'inspect',
'--format', '{{.State.Status}}||{{.Config.Image}}||{{.State.StartedAt}}',
'--format', '{{.State.Status}}||{{.Config.Image}}||{{.State.StartedAt}}||{{json .NetworkSettings.Ports}}',
$containerName,
]);
$process->setTimeout(10);
@@ -50,10 +51,11 @@ final class DockerService
'image' => '',
'version' => '',
'startedAt' => '',
'ports' => [],
];
}
$parts = explode('||', trim($process->getOutput()));
$parts = explode('||', trim($process->getOutput()), 4);
if (\count($parts) < 3) {
return [
@@ -61,6 +63,7 @@ final class DockerService
'image' => '',
'version' => '',
'startedAt' => '',
'ports' => [],
];
}
@@ -70,11 +73,32 @@ final class DockerService
$version = substr($image, strrpos($image, ':') + 1);
}
$ports = [];
if (isset($parts[3])) {
$portsJson = json_decode($parts[3], true);
if (\is_array($portsJson)) {
foreach ($portsJson as $containerPort => $bindings) {
if (!\is_array($bindings)) {
continue;
}
[$port, $protocol] = explode('/', $containerPort) + [1 => 'tcp'];
foreach ($bindings as $binding) {
$ports[] = [
'hostPort' => $binding['HostPort'] ?? '',
'containerPort' => $port,
'protocol' => $protocol,
];
}
}
}
}
return [
'status' => $parts[0],
'image' => $image,
'version' => $version,
'startedAt' => $parts[2],
'ports' => $ports,
];
}