The image name is now the repo + tag. Also:Improve labeling

This commit is contained in:
Anders Ingemann 2015-12-13 16:10:07 +01:00
parent 5dada603eb
commit d0bb9f75d3
5 changed files with 49 additions and 44 deletions

View file

@ -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}

View file

@ -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):

View file

@ -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:

View file

@ -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'

View file

@ -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: >