mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-08 01:36:29 +00:00
Use label instead env, cleanup build (#50)
* Use label instead env, cleanup build * Update const.py * fix lint * add space * fix lint * use dynamic type * fix lint * fix path * fix label read * fix bug
This commit is contained in:
parent
6f4f6338c5
commit
4bdd256000
@ -26,6 +26,14 @@ FILE_HASSIO_CONFIG = Path(HASSIO_SHARE, "config.json")
|
|||||||
SOCKET_DOCKER = Path("/var/run/docker.sock")
|
SOCKET_DOCKER = Path("/var/run/docker.sock")
|
||||||
SOCKET_HC = Path("/var/run/hassio-hc.sock")
|
SOCKET_HC = Path("/var/run/hassio-hc.sock")
|
||||||
|
|
||||||
|
LABEL_VERSION = 'io.hass.version'
|
||||||
|
LABEL_ARCH = 'io.hass.arch'
|
||||||
|
LABEL_TYPE = 'io.hass.type'
|
||||||
|
|
||||||
|
META_ADDON = 'addon'
|
||||||
|
META_SUPERVISOR = 'supervisor'
|
||||||
|
META_HOMEASSISTANT = 'homeassistant'
|
||||||
|
|
||||||
JSON_RESULT = 'result'
|
JSON_RESULT = 'result'
|
||||||
JSON_DATA = 'data'
|
JSON_DATA = 'data'
|
||||||
JSON_MESSAGE = 'message'
|
JSON_MESSAGE = 'message'
|
||||||
|
@ -5,6 +5,7 @@ import logging
|
|||||||
|
|
||||||
import docker
|
import docker
|
||||||
|
|
||||||
|
from ..const import LABEL_VERSION
|
||||||
from ..tools import get_version_from_env
|
from ..tools import get_version_from_env
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -33,6 +34,19 @@ class DockerBase(object):
|
|||||||
"""Return True if a task is in progress."""
|
"""Return True if a task is in progress."""
|
||||||
return self._lock.locked()
|
return self._lock.locked()
|
||||||
|
|
||||||
|
def process_metadata(self, metadata=None, force=False):
|
||||||
|
"""Read metadata and set it to object."""
|
||||||
|
if not force and self.version:
|
||||||
|
return
|
||||||
|
|
||||||
|
# read metadata
|
||||||
|
metadata = metadata or self.container.attrs
|
||||||
|
if LABEL_VERSION in metadata['Config']['Labels']:
|
||||||
|
self.version = metadata['Config']['Labels'][LABEL_VERSION]
|
||||||
|
else:
|
||||||
|
# dedicated
|
||||||
|
self.version = get_version_from_env(metadata['Config']['Env'])
|
||||||
|
|
||||||
async def install(self, tag):
|
async def install(self, tag):
|
||||||
"""Pull docker image."""
|
"""Pull docker image."""
|
||||||
if self._lock.locked():
|
if self._lock.locked():
|
||||||
@ -51,8 +65,8 @@ class DockerBase(object):
|
|||||||
_LOGGER.info("Pull image %s tag %s.", self.image, tag)
|
_LOGGER.info("Pull image %s tag %s.", self.image, tag)
|
||||||
image = self.dock.images.pull("{}:{}".format(self.image, tag))
|
image = self.dock.images.pull("{}:{}".format(self.image, tag))
|
||||||
|
|
||||||
self.version = tag
|
|
||||||
image.tag(self.image, tag='latest')
|
image.tag(self.image, tag='latest')
|
||||||
|
self.process_metadata(metadata=image.attrs, force=True)
|
||||||
except docker.errors.APIError as err:
|
except docker.errors.APIError as err:
|
||||||
_LOGGER.error("Can't install %s:%s -> %s.", self.image, tag, err)
|
_LOGGER.error("Can't install %s:%s -> %s.", self.image, tag, err)
|
||||||
return False
|
return False
|
||||||
@ -74,7 +88,7 @@ class DockerBase(object):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
image = self.dock.images.get(self.image)
|
image = self.dock.images.get(self.image)
|
||||||
self.version = get_version_from_env(image.attrs['Config']['Env'])
|
self.process_metadata(metadata=image.attrs)
|
||||||
except docker.errors.DockerException:
|
except docker.errors.DockerException:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -95,8 +109,7 @@ class DockerBase(object):
|
|||||||
if not self.container:
|
if not self.container:
|
||||||
try:
|
try:
|
||||||
self.container = self.dock.containers.get(self.docker_name)
|
self.container = self.dock.containers.get(self.docker_name)
|
||||||
self.version = get_version_from_env(
|
self.process_metadata()
|
||||||
self.container.attrs['Config']['Env'])
|
|
||||||
except docker.errors.DockerException:
|
except docker.errors.DockerException:
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
@ -121,8 +134,7 @@ class DockerBase(object):
|
|||||||
try:
|
try:
|
||||||
self.container = self.dock.containers.get(self.docker_name)
|
self.container = self.dock.containers.get(self.docker_name)
|
||||||
self.image = self.container.attrs['Config']['Image']
|
self.image = self.container.attrs['Config']['Image']
|
||||||
self.version = get_version_from_env(
|
self.process_metadata()
|
||||||
self.container.attrs['Config']['Env'])
|
|
||||||
_LOGGER.info("Attach to image %s with version %s",
|
_LOGGER.info("Attach to image %s with version %s",
|
||||||
self.image, self.version)
|
self.image, self.version)
|
||||||
except (docker.errors.DockerException, KeyError):
|
except (docker.errors.DockerException, KeyError):
|
||||||
|
@ -7,7 +7,7 @@ import docker
|
|||||||
|
|
||||||
from . import DockerBase
|
from . import DockerBase
|
||||||
from .util import dockerfile_template
|
from .util import dockerfile_template
|
||||||
from ..tools import get_version_from_env
|
from ..const import META_ADDON
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -82,9 +82,7 @@ class DockerAddon(DockerBase):
|
|||||||
volumes=self.volumes,
|
volumes=self.volumes,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.version = get_version_from_env(
|
self.process_metadata()
|
||||||
self.container.attrs['Config']['Env'])
|
|
||||||
|
|
||||||
_LOGGER.info("Start docker addon %s with version %s",
|
_LOGGER.info("Start docker addon %s with version %s",
|
||||||
self.image, self.version)
|
self.image, self.version)
|
||||||
|
|
||||||
@ -101,8 +99,7 @@ class DockerAddon(DockerBase):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
self.container = self.dock.containers.get(self.docker_name)
|
self.container = self.dock.containers.get(self.docker_name)
|
||||||
self.version = get_version_from_env(
|
self.process_metadata()
|
||||||
self.container.attrs['Config']['Env'])
|
|
||||||
|
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"Attach to image %s with version %s", self.image, self.version)
|
"Attach to image %s with version %s", self.image, self.version)
|
||||||
@ -147,7 +144,8 @@ class DockerAddon(DockerBase):
|
|||||||
# prepare Dockerfile
|
# prepare Dockerfile
|
||||||
try:
|
try:
|
||||||
dockerfile_template(
|
dockerfile_template(
|
||||||
Path(build_dir, 'Dockerfile'), self.addons_data.arch, tag)
|
Path(build_dir, 'Dockerfile'), self.addons_data.arch,
|
||||||
|
tag, META_ADDON)
|
||||||
except OSError as err:
|
except OSError as err:
|
||||||
_LOGGER.error("Can't prepare dockerfile -> %s", err)
|
_LOGGER.error("Can't prepare dockerfile -> %s", err)
|
||||||
|
|
||||||
@ -159,8 +157,8 @@ class DockerAddon(DockerBase):
|
|||||||
image = self.dock.images.build(
|
image = self.dock.images.build(
|
||||||
path=str(build_dir), tag=build_tag, pull=True)
|
path=str(build_dir), tag=build_tag, pull=True)
|
||||||
|
|
||||||
self.version = tag
|
|
||||||
image.tag(self.image, tag='latest')
|
image.tag(self.image, tag='latest')
|
||||||
|
self.process_metadata(metadata=image.attrs, force=True)
|
||||||
|
|
||||||
except (docker.errors.DockerException, TypeError) as err:
|
except (docker.errors.DockerException, TypeError) as err:
|
||||||
_LOGGER.error("Can't build %s -> %s", build_tag, err)
|
_LOGGER.error("Can't build %s -> %s", build_tag, err)
|
||||||
|
@ -4,7 +4,6 @@ import logging
|
|||||||
import docker
|
import docker
|
||||||
|
|
||||||
from . import DockerBase
|
from . import DockerBase
|
||||||
from ..tools import get_version_from_env
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -51,8 +50,7 @@ class DockerHomeAssistant(DockerBase):
|
|||||||
{'bind': '/ssl', 'mode': 'rw'},
|
{'bind': '/ssl', 'mode': 'rw'},
|
||||||
})
|
})
|
||||||
|
|
||||||
self.version = get_version_from_env(
|
self.process_metadata()
|
||||||
self.container.attrs['Config']['Env'])
|
|
||||||
|
|
||||||
_LOGGER.info("Start docker addon %s with version %s",
|
_LOGGER.info("Start docker addon %s with version %s",
|
||||||
self.image, self.version)
|
self.image, self.version)
|
||||||
|
@ -11,11 +11,10 @@ RESIN_BASE_IMAGE = {
|
|||||||
ARCH_AMD64: "resin/amd64-alpine:3.5",
|
ARCH_AMD64: "resin/amd64-alpine:3.5",
|
||||||
}
|
}
|
||||||
|
|
||||||
TMPL_VERSION = re.compile(r"%%VERSION%%")
|
|
||||||
TMPL_IMAGE = re.compile(r"%%BASE_IMAGE%%")
|
TMPL_IMAGE = re.compile(r"%%BASE_IMAGE%%")
|
||||||
|
|
||||||
|
|
||||||
def dockerfile_template(dockerfile, arch, version):
|
def dockerfile_template(dockerfile, arch, version, meta_type):
|
||||||
"""Prepare a Hass.IO dockerfile."""
|
"""Prepare a Hass.IO dockerfile."""
|
||||||
buff = []
|
buff = []
|
||||||
resin_image = RESIN_BASE_IMAGE[arch]
|
resin_image = RESIN_BASE_IMAGE[arch]
|
||||||
@ -23,10 +22,19 @@ def dockerfile_template(dockerfile, arch, version):
|
|||||||
# read docker
|
# read docker
|
||||||
with dockerfile.open('r') as dock_input:
|
with dockerfile.open('r') as dock_input:
|
||||||
for line in dock_input:
|
for line in dock_input:
|
||||||
line = TMPL_VERSION.sub(version, line)
|
|
||||||
line = TMPL_IMAGE.sub(resin_image, line)
|
line = TMPL_IMAGE.sub(resin_image, line)
|
||||||
buff.append(line)
|
buff.append(line)
|
||||||
|
|
||||||
|
# add metadata
|
||||||
|
buff.append(create_metadata(version, arch, meta_type))
|
||||||
|
|
||||||
# write docker
|
# write docker
|
||||||
with dockerfile.open('w') as dock_output:
|
with dockerfile.open('w') as dock_output:
|
||||||
dock_output.writelines(buff)
|
dock_output.writelines(buff)
|
||||||
|
|
||||||
|
|
||||||
|
def create_metadata(version, arch, meta_type):
|
||||||
|
"""Generate docker label layer for hassio."""
|
||||||
|
return ('LABEL io.hass.version="{}" '
|
||||||
|
'io.hass.arch="{}" '
|
||||||
|
'io.hass.type="{}"').format(version, arch, meta_type)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user