79 lines
2.1 KiB
PHP
79 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
class DockerImageParser
|
|
{
|
|
private string $registryUrl = '';
|
|
|
|
private string $imageName = '';
|
|
|
|
private string $tag = 'latest';
|
|
|
|
public function parse(string $imageString): self
|
|
{
|
|
// First split by : to handle the tag, but be careful with registry ports
|
|
$lastColon = strrpos($imageString, ':');
|
|
$hasSlash = str_contains($imageString, '/');
|
|
|
|
// If the last colon appears after the last slash, it's a tag
|
|
// Otherwise it might be a port in the registry URL
|
|
if ($lastColon !== false && (! $hasSlash || $lastColon > strrpos($imageString, '/'))) {
|
|
$mainPart = substr($imageString, 0, $lastColon);
|
|
$this->tag = substr($imageString, $lastColon + 1);
|
|
} else {
|
|
$mainPart = $imageString;
|
|
$this->tag = 'latest';
|
|
}
|
|
|
|
// Split the main part by / to handle registry and image name
|
|
$pathParts = explode('/', $mainPart);
|
|
|
|
// If we have more than one part and the first part contains a dot or colon
|
|
// it's likely a registry URL
|
|
if (count($pathParts) > 1 && (str_contains($pathParts[0], '.') || str_contains($pathParts[0], ':'))) {
|
|
$this->registryUrl = array_shift($pathParts);
|
|
$this->imageName = implode('/', $pathParts);
|
|
} else {
|
|
$this->imageName = $mainPart;
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getFullImageNameWithoutTag(): string
|
|
{
|
|
if ($this->registryUrl) {
|
|
return $this->registryUrl.'/'.$this->imageName;
|
|
}
|
|
|
|
return $this->imageName;
|
|
}
|
|
|
|
public function getRegistryUrl(): string
|
|
{
|
|
return $this->registryUrl;
|
|
}
|
|
|
|
public function getImageName(): string
|
|
{
|
|
return $this->imageName;
|
|
}
|
|
|
|
public function getTag(): string
|
|
{
|
|
return $this->tag;
|
|
}
|
|
|
|
public function toString(): string
|
|
{
|
|
$parts = [];
|
|
if ($this->registryUrl) {
|
|
$parts[] = $this->registryUrl;
|
|
}
|
|
$parts[] = $this->imageName;
|
|
|
|
return implode('/', $parts).':'.$this->tag;
|
|
}
|
|
}
|