From d0bb9f75d3b570ae0057b194778b860e997a3a58 Mon Sep 17 00:00:00 2001 From: Anders Ingemann Date: Sun, 13 Dec 2015 16:10:07 +0100 Subject: [PATCH] The image name is now the repo + tag. Also:Improve labeling --- bootstrapvz/providers/docker/README.rst | 18 +++--- bootstrapvz/providers/docker/__init__.py | 7 ++- .../providers/docker/manifest-schema.yml | 5 -- bootstrapvz/providers/docker/tasks/image.py | 61 +++++++++++-------- .../examples/docker/minimized-jessie.yml | 2 - 5 files changed, 49 insertions(+), 44 deletions(-) diff --git a/bootstrapvz/providers/docker/README.rst b/bootstrapvz/providers/docker/README.rst index 155ebf9..3b0ba4c 100644 --- a/bootstrapvz/providers/docker/README.rst +++ b/bootstrapvz/providers/docker/README.rst @@ -14,15 +14,17 @@ With optimal settings a 64-bit jessie image can be whittled down to 81.95 MB Manifest settings ----------------- +Name +~~~~ + +- ``name``: The image name is the repository and tag to where an + image should be imported. + ``required`` + + Provider ~~~~~~~~ -- ``repository``: Repository to which the image should be imported. - ``required`` - -- ``tag``: Name with which the image should be tagged. - ``required`` - - ``dockerfile``: Inline dockerfile that should be appended to the one created by the bootstrapper. ``optional`` @@ -43,11 +45,11 @@ Example: .. code:: yaml --- + name: bootstrap-vz:latest provider: name: docker - repository: bootstrap-vz - tag: latest dockerfile: > CMD /bin/bash labels: + name: debian-{system.release}-{system.architecture}-{%y}{%m}{%d} description: Debian {system.release} {system.architecture} diff --git a/bootstrapvz/providers/docker/__init__.py b/bootstrapvz/providers/docker/__init__.py index 452c1fd..135eae9 100644 --- a/bootstrapvz/providers/docker/__init__.py +++ b/bootstrapvz/providers/docker/__init__.py @@ -25,10 +25,13 @@ def resolve_tasks(taskset, manifest): taskset.update(task_groups.cleanup_group) taskset.update([tasks.commands.AddRequiredCommands, - tasks.image.PopulateDockerfileLabels, - tasks.image.CreateDockerfile, + tasks.image.CreateDockerfileEntry, tasks.image.CreateImage, ]) + if 'labels' in manifest.provider: + taskset.add(tasks.image.PopulateLabels) + if 'dockerfile' in manifest.provider: + taskset.add(tasks.image.AppendManifestDockerfile) def resolve_rollback_tasks(taskset, manifest, completed, counter_task): diff --git a/bootstrapvz/providers/docker/manifest-schema.yml b/bootstrapvz/providers/docker/manifest-schema.yml index dd50ff6..4b3506e 100644 --- a/bootstrapvz/providers/docker/manifest-schema.yml +++ b/bootstrapvz/providers/docker/manifest-schema.yml @@ -6,10 +6,6 @@ properties: provider: type: object properties: - repository: - type: string - tag: - type: string labels: type: object properties: @@ -25,7 +21,6 @@ properties: ^.+$: {type: string} dockerfile: type: string - required: [repository, tag] system: type: object properties: diff --git a/bootstrapvz/providers/docker/tasks/image.py b/bootstrapvz/providers/docker/tasks/image.py index 2ce99b9..d4fc067 100644 --- a/bootstrapvz/providers/docker/tasks/image.py +++ b/bootstrapvz/providers/docker/tasks/image.py @@ -3,10 +3,35 @@ from bootstrapvz.common import phases from bootstrapvz.common.tools import log_check_call -class PopulateDockerfileLabels(Task): - description = 'Populating dockerfile labels' +class CreateDockerfileEntry(Task): + description = 'Creating the Dockerfile entry' + phase = phases.preparation + + @classmethod + def run(cls, info): + info._docker['dockerfile'] = '' + + +class CreateImage(Task): + description = 'Creating docker image' phase = phases.image_registration + @classmethod + def run(cls, info): + from pipes import quote + tar_cmd = ['tar', '--create', '--numeric-owner', + '--directory', info.volume.path, '.'] + docker_cmd = ['docker', 'import', '--change', info._docker['dockerfile'], '-', + info.manifest.name] + cmd = ' '.join(map(quote, tar_cmd)) + ' | ' + ' '.join(map(quote, docker_cmd)) + [info._docker['container_id']] = log_check_call([cmd], shell=True) + + +class PopulateLabels(Task): + description = 'Populating docker labels' + phase = phases.image_registration + successors = [CreateImage] + @classmethod def run(cls, info): import pyrfc3339 @@ -22,16 +47,7 @@ class PopulateDockerfileLabels(Task): if 'labels' in info.manifest.provider: for label, value in info.manifest.provider['labels'].items(): labels[label] = value.format(**info.manifest_vars) - info._docker['dockerfile_labels'] = labels - -class CreateDockerfile(Task): - description = 'Creating dockerfile' - phase = phases.image_registration - predecessors = [PopulateDockerfileLabels] - - @classmethod - def run(cls, info): # pipes.quote converts newlines into \n rather than just prefixing # it with a backslash, so we need to escape manually def escape(value): @@ -39,26 +55,17 @@ class CreateDockerfile(Task): value = value.replace('\n', '\\\n') value = '"' + value + '"' return value - labels = [] - for label, value in info._docker['dockerfile_labels'].items(): - labels.append(label + '=' + escape(value)) + kv_pairs = [label + '=' + escape(value) for label, value in labels.items()] # Add some nice newlines and indentation - info._docker['dockerfile'] = 'LABEL ' + ' \\\n '.join(labels) + '\n' - if 'dockerfile' in info.manifest.provider: - info._docker['dockerfile'] += info.manifest.provider['dockerfile'] + '\n' + info._docker['dockerfile'] += 'LABEL ' + ' \\\n '.join(kv_pairs) + '\n' -class CreateImage(Task): - description = 'Creating docker image' +class AppendManifestDockerfile(Task): + description = 'Appending Dockerfile instructions from the manifest' phase = phases.image_registration - predecessors = [CreateDockerfile] + predecessors = [PopulateLabels] + successors = [CreateImage] @classmethod def run(cls, info): - from pipes import quote - tar_cmd = ['tar', '--create', '--numeric-owner', - '--directory', info.volume.path, '.'] - docker_cmd = ['docker', 'import', '--change', info._docker['dockerfile'], '-', - info.manifest.provider['repository'] + ':' + info.manifest.provider['tag']] - cmd = ' '.join(map(quote, tar_cmd)) + ' | ' + ' '.join(map(quote, docker_cmd)) - [info._docker['container_id']] = log_check_call(cmd, shell=True) + info._docker['dockerfile'] += info.manifest.provider['dockerfile'] + '\n' diff --git a/manifests/examples/docker/minimized-jessie.yml b/manifests/examples/docker/minimized-jessie.yml index 71be5da..e46e71c 100644 --- a/manifests/examples/docker/minimized-jessie.yml +++ b/manifests/examples/docker/minimized-jessie.yml @@ -2,8 +2,6 @@ name: debian-{system.release}-{system.architecture}-{%y}{%m}{%d} provider: name: docker - repository: bootstrap-vz - tag: latest labels: description: Debian {system.release} {system.architecture} dockerfile: >