mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-06-23 18:36:29 +00:00
82 lines
2.4 KiB
Python
82 lines
2.4 KiB
Python
"""Init file for HassIO addon docker object."""
|
|
import logging
|
|
|
|
import docker
|
|
|
|
from . import DockerBase
|
|
from ..tools import get_version_from_env
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
HASS_DOCKER_NAME = 'homeassistant'
|
|
|
|
|
|
class DockerAddon(DockerBase):
|
|
"""Docker hassio wrapper for HomeAssistant."""
|
|
|
|
def __init__(self, config, loop, dock, addons_data, addon):
|
|
"""Initialize docker homeassistant wrapper."""
|
|
super().__init__(
|
|
config, loop, dock, image=addons_data.get_image(addon))
|
|
self.addon = addon
|
|
self.addons_data = addons_data
|
|
|
|
@property
|
|
def docker_name(self):
|
|
"""Return name of docker container."""
|
|
return "addon_{}".format(self.addons_data.get_slug(self.addon))
|
|
|
|
def _run(self):
|
|
"""Run docker image.
|
|
|
|
Need run inside executor.
|
|
"""
|
|
if self._is_running():
|
|
return
|
|
|
|
# cleanup old container
|
|
self._stop()
|
|
|
|
# volumes
|
|
volumes = {
|
|
self.addons_data.path_data_docker(self.addon): {
|
|
'bind': '/data', 'mode': 'rw'
|
|
}}
|
|
if self.addons_data.need_config(self.addon):
|
|
volumes.update({
|
|
self.config.path_config_docker: {
|
|
'bind': '/config', 'mode': 'rw'
|
|
}})
|
|
if self.addons_data.need_ssl(self.addon):
|
|
volumes.update({
|
|
self.config.path_ssl_docker: {
|
|
'bind': '/ssl', 'mode': 'rw'
|
|
}})
|
|
if self.addons_data.need_hassio(self.addon):
|
|
volumes.update({
|
|
self.config.path_hassio_docker: {
|
|
'bind': '/hassio', 'mode': 'rw'
|
|
}})
|
|
|
|
try:
|
|
self.container = self.dock.containers.run(
|
|
self.image,
|
|
name=self.docker_name,
|
|
detach=True,
|
|
network_mode='bridge',
|
|
ports=self.addons_data.get_ports(self.addon),
|
|
restart_policy={
|
|
"Name": "on-failure",
|
|
"MaximumRetryCount": 10,
|
|
},
|
|
volumes=volumes,
|
|
)
|
|
|
|
self.version = get_version_from_env(
|
|
self.container.attrs['Config']['Env'])
|
|
except docker.errors.DockerException as err:
|
|
_LOGGER.error("Can't run %s -> %s", self.image, err)
|
|
return False
|
|
|
|
return True
|