diff --git a/supervisor/addons/build.py b/supervisor/addons/build.py index 6556ed8aa..b033b0eeb 100644 --- a/supervisor/addons/build.py +++ b/supervisor/addons/build.py @@ -9,6 +9,7 @@ from awesomeversion import AwesomeVersion from ..const import ( ATTR_ARGS, ATTR_BUILD_FROM, + ATTR_LABELS, ATTR_SQUASH, FILE_SUFFIX_CONFIGURATION, META_ADDON, @@ -46,9 +47,12 @@ class AddonBuild(FileConfiguration, CoreSysAttributes): @property def base_image(self) -> str: """Return base image for this add-on.""" - return self._data[ATTR_BUILD_FROM].get( - self.sys_arch.default, f"homeassistant/{self.sys_arch.default}-base:latest" - ) + if not self._data[ATTR_BUILD_FROM]: + return f"homeassistant/{self.sys_arch.default}-base:latest" + + # Evaluate correct base image + arch = self.sys_arch.match(list(self._data[ATTR_BUILD_FROM].keys())) + return self._data[ATTR_BUILD_FROM][arch] @property def squash(self) -> bool: @@ -60,6 +64,11 @@ class AddonBuild(FileConfiguration, CoreSysAttributes): """Return additional Docker build arguments.""" return self._data[ATTR_ARGS] + @property + def additional_labels(self) -> Dict[str, str]: + """Return additional Docker labels.""" + return self._data[ATTR_LABELS] + @property def is_valid(self) -> bool: """Return true if the build env is valid.""" @@ -76,7 +85,7 @@ class AddonBuild(FileConfiguration, CoreSysAttributes): "path": str(self.addon.path_location), "tag": f"{self.addon.image}:{version!s}", "pull": True, - "forcerm": True, + "forcerm": not self.sys_dev, "squash": self.squash, "labels": { "io.hass.version": version, @@ -84,6 +93,7 @@ class AddonBuild(FileConfiguration, CoreSysAttributes): "io.hass.type": META_ADDON, "io.hass.name": self._fix_label("name"), "io.hass.description": self._fix_label("description"), + **self.additional_labels, }, "buildargs": { "BUILD_FROM": self.base_image, diff --git a/supervisor/addons/validate.py b/supervisor/addons/validate.py index 700be80cf..02bdc2761 100644 --- a/supervisor/addons/validate.py +++ b/supervisor/addons/validate.py @@ -47,6 +47,7 @@ from ..const import ( ATTR_INIT, ATTR_JOURNALD, ATTR_KERNEL_MODULES, + ATTR_LABELS, ATTR_LEGACY, ATTR_LOCATON, ATTR_MACHINE, @@ -317,9 +318,8 @@ SCHEMA_BUILD_CONFIG = vol.Schema( {vol.In(ARCH_ALL): vol.Match(RE_DOCKER_IMAGE_BUILD)} ), vol.Optional(ATTR_SQUASH, default=False): vol.Boolean(), - vol.Optional(ATTR_ARGS, default=dict): vol.Schema( - {vol.Coerce(str): vol.Coerce(str)} - ), + vol.Optional(ATTR_ARGS, default=dict): vol.Schema({str: str}), + vol.Optional(ATTR_LABELS, default=dict): vol.Schema({str: str}), }, extra=vol.REMOVE_EXTRA, ) diff --git a/supervisor/const.py b/supervisor/const.py index b757d8218..92e5bc0e9 100644 --- a/supervisor/const.py +++ b/supervisor/const.py @@ -102,6 +102,7 @@ ATTR_APPARMOR = "apparmor" ATTR_APPLICATION = "application" ATTR_ARCH = "arch" ATTR_ARGS = "args" +ATTR_LABELS = "labels" ATTR_AUDIO = "audio" ATTR_AUDIO_INPUT = "audio_input" ATTR_AUDIO_OUTPUT = "audio_output"