mirror of
https://github.com/stan220/testcontainers-php.git
synced 2026-09-12 05:29:36 +00:00
Support for waiting on tcp port to open
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Testcontainer\Wait;
|
||||
|
||||
use JsonException;
|
||||
use RuntimeException;
|
||||
use Symfony\Component\Process\Process;
|
||||
use Testcontainer\Exception\ContainerNotReadyException;
|
||||
|
||||
/**
|
||||
* @phpstan-type ContainerInspect array<int, array{'NetworkSettings': array{'IPAddress': string}}>
|
||||
*/
|
||||
final class WaitForTcpPortOpen implements WaitInterface
|
||||
{
|
||||
public function __construct(private readonly int $port)
|
||||
{
|
||||
}
|
||||
|
||||
public static function make(int $port): self
|
||||
{
|
||||
return new self($port);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws JsonException
|
||||
*/
|
||||
public function wait(string $id): void
|
||||
{
|
||||
if (@fsockopen($this->findContainerAddress($id), $this->port) === false) {
|
||||
throw new ContainerNotReadyException($id, new RuntimeException('Unable to connect to container TCP port'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws JsonException
|
||||
*/
|
||||
private function findContainerAddress(string $id): string
|
||||
{
|
||||
$process = new Process(['docker', 'inspect', $id]);
|
||||
$process->mustRun();
|
||||
|
||||
/** @var ContainerInspect $data */
|
||||
$data = json_decode($process->getOutput(), true, 512, JSON_THROW_ON_ERROR);
|
||||
|
||||
$containerAddress = $data[0]['NetworkSettings']['IPAddress'] ?? null;
|
||||
|
||||
if (! is_string($containerAddress)) {
|
||||
throw new ContainerNotReadyException($id, new RuntimeException('Unable to find container IP address'));
|
||||
}
|
||||
|
||||
return $containerAddress;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user