diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php index e4625a24..9854655e 100644 --- a/php/src/ContainerDefinitionFetcher.php +++ b/php/src/ContainerDefinitionFetcher.php @@ -52,14 +52,18 @@ readonly class ContainerDefinitionFetcher { $standardContainerNames = array_column($data['aio_services_v1'], 'container_name'); $additionalContainerNames = []; + $additionalTopLevelContainerNames = []; foreach ($this->configurationManager->aioCommunityContainers as $communityContainer) { if ($communityContainer !== '') { $path = DataConst::GetCommunityContainersDirectory() . '/' . $communityContainer . '/' . $communityContainer . '.json'; $additionalData = json_decode((string)file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); $data = array_merge_recursive($data, $additionalData); + foreach ($additionalData['aio_services_v1'] as $additionalEntry) { + $additionalContainerNames[] = $additionalEntry['container_name']; + } if (isset($additionalData['aio_services_v1'][0]['display_name']) && $additionalData['aio_services_v1'][0]['display_name'] !== '') { - // Store container_name of community containers in variable for later - $additionalContainerNames[] = $additionalData['aio_services_v1'][0]['container_name']; + // Store main container_name of community containers in variable for later + $additionalTopLevelContainerNames[] = $additionalData['aio_services_v1'][0]['container_name']; } } } @@ -176,7 +180,7 @@ readonly class ContainerDefinitionFetcher { if ($entry['container_name'] === 'nextcloud-aio-apache') { // Add community containers first and default ones last so that aio_variables works correctly $valueDependsOnTemp = []; - foreach ($additionalContainerNames as $containerName) { + foreach ($additionalTopLevelContainerNames as $containerName) { $valueDependsOnTemp[] = $containerName; } $valueDependsOn = array_merge_recursive($valueDependsOnTemp, $valueDependsOn); diff --git a/php/src/Docker/DockerHubManager.php b/php/src/Docker/DockerHubManager.php index c11d81eb..a7d35ed7 100644 --- a/php/src/Docker/DockerHubManager.php +++ b/php/src/Docker/DockerHubManager.php @@ -3,8 +3,6 @@ declare(strict_types=1); namespace AIO\Docker; -use AIO\ContainerDefinitionFetcher; -use AIO\Data\ConfigurationManager; use GuzzleHttp\Client; readonly class DockerHubManager { @@ -15,6 +13,16 @@ readonly class DockerHubManager { $this->guzzleClient = new Client(); } + + // Official Docker Hub images need the library/ prefix when using the registry API directly. + private function normalizeImageName(string $name): string { + if (!str_contains($name, '/')) { + return 'library/' . $name; + } + return $name; + } + + public function GetLatestDigestOfTag(string $name, string $tag) : ?string { $cacheKey = 'dockerhub-manifest-' . $name . $tag; @@ -24,6 +32,7 @@ readonly class DockerHubManager { } // If one of the links below should ever become outdated, we can still upgrade the mastercontainer via the webinterface manually by opening '/api/docker/getwatchtower' + $name = $this->normalizeImageName($name); try { $authTokenRequest = $this->guzzleClient->request(