From bac7c21fe884bd74879ea6df31a025bcd77bee9b Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 20 May 2025 10:24:27 +0200 Subject: [PATCH] Fix container image detection for aarch64 (#5898) --- supervisor/docker/interface.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/supervisor/docker/interface.py b/supervisor/docker/interface.py index f0582cde2..9c608669f 100644 --- a/supervisor/docker/interface.py +++ b/supervisor/docker/interface.py @@ -455,11 +455,11 @@ class DockerInterface(JobGroup, ABC): self, version: AwesomeVersion, expected_image: str, - expected_arch: CpuArch | None = None, + expected_cpu_arch: CpuArch | None = None, ) -> None: """Check we have expected image with correct arch.""" - expected_image_arch = ( - str(expected_arch) if expected_arch else self.sys_arch.supervisor + expected_image_cpu_arch = ( + str(expected_cpu_arch) if expected_cpu_arch else self.sys_arch.supervisor ) image_name = f"{expected_image}:{version!s}" if self.image == expected_image: @@ -478,13 +478,22 @@ class DockerInterface(JobGroup, ABC): image_arch = f"{image_arch}/{image.attrs['Variant']}" # If we have an image and its the right arch, all set - if MAP_ARCH[expected_image_arch] == image_arch: + # It seems that newer Docker version return a variant for arm64 images. + # Make sure we match linux/arm64 and linux/arm64/v8. + expected_image_arch = MAP_ARCH[expected_image_cpu_arch] + if image_arch.startswith(expected_image_arch): return + _LOGGER.info( + "Image %s has arch %s, expected %s. Reinstalling.", + image_name, + image_arch, + expected_image_arch, + ) # We're missing the image we need. Stop and clean up what we have then pull the right one with suppress(DockerError): await self.remove() - await self.install(version, expected_image, arch=expected_image_arch) + await self.install(version, expected_image, arch=expected_image_cpu_arch) @Job( name="docker_interface_update",