diff --git a/hassio/addons/__init__.py b/hassio/addons/__init__.py index 7b3114279..fe95b1d29 100644 --- a/hassio/addons/__init__.py +++ b/hassio/addons/__init__.py @@ -285,6 +285,9 @@ class AddonManager(CoreSysAttributes): for addon in needs_repair: _LOGGER.info("Start repair for add-on: %s", addon.slug) + await self.sys_run_in_executor( + self.sys_docker.network.stale_cleanup, addon.instance.name + ) with suppress(DockerAPIError, KeyError): # Need pull a image again diff --git a/hassio/docker/__init__.py b/hassio/docker/__init__.py index 66c0846ab..8274d506a 100644 --- a/hassio/docker/__init__.py +++ b/hassio/docker/__init__.py @@ -178,3 +178,10 @@ class DockerAPI: _LOGGER.debug("Volumes prune: %s", output) except docker.errors.APIError as err: _LOGGER.warning("Error for volumes prune: %s", err) + + _LOGGER.info("Prune stale networks") + try: + output = self.docker.api.prune_networks() + _LOGGER.debug("Networks prune: %s", output) + except docker.errors.APIError as err: + _LOGGER.warning("Error for networks prune: %s", err) diff --git a/hassio/docker/network.py b/hassio/docker/network.py index 3f4d0943b..610a4db61 100644 --- a/hassio/docker/network.py +++ b/hassio/docker/network.py @@ -1,4 +1,5 @@ """Internal network manager for Hass.io.""" +from contextlib import suppress from ipaddress import IPv4Address import logging from typing import List, Optional @@ -107,3 +108,11 @@ class DockerNetwork: except docker.errors.APIError as err: _LOGGER.warning("Can't disconnect container from default: %s", err) raise DockerAPIError() from None + + def stale_cleanup(self, container_name: str): + """Remove force a container from Network. + + Fix: https://github.com/moby/moby/issues/23302 + """ + with suppress(docker.errors.APIError): + self.network.disconnect(container_name, force=True) diff --git a/hassio/homeassistant.py b/hassio/homeassistant.py index 9fe656659..672c71856 100644 --- a/hassio/homeassistant.py +++ b/hassio/homeassistant.py @@ -605,6 +605,11 @@ class HomeAssistant(JsonConfig, CoreSysAttributes): return _LOGGER.info("Repair Home Assistant %s", self.version) + await self.sys_run_in_executor( + self.sys_docker.network.stale_cleanup, self.instance.name + ) + + # Pull image try: await self.instance.install(self.version) except DockerAPIError: