mirror of
https://github.com/kevingruesser/bootstrap-vz.git
synced 2025-10-07 17:40:30 +00:00
The image name is now the repo + tag. Also:Improve labeling
This commit is contained in:
parent
5dada603eb
commit
d0bb9f75d3
5 changed files with 49 additions and 44 deletions
|
@ -14,15 +14,17 @@ With optimal settings a 64-bit jessie image can be whittled down to 81.95 MB
|
||||||
Manifest settings
|
Manifest settings
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
Name
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
- ``name``: The image name is the repository and tag to where an
|
||||||
|
image should be imported.
|
||||||
|
``required``
|
||||||
|
|
||||||
|
|
||||||
Provider
|
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
|
- ``dockerfile``: Inline dockerfile that should be appended to
|
||||||
the one created by the bootstrapper.
|
the one created by the bootstrapper.
|
||||||
``optional``
|
``optional``
|
||||||
|
@ -43,11 +45,11 @@ Example:
|
||||||
.. code:: yaml
|
.. code:: yaml
|
||||||
|
|
||||||
---
|
---
|
||||||
|
name: bootstrap-vz:latest
|
||||||
provider:
|
provider:
|
||||||
name: docker
|
name: docker
|
||||||
repository: bootstrap-vz
|
|
||||||
tag: latest
|
|
||||||
dockerfile: >
|
dockerfile: >
|
||||||
CMD /bin/bash
|
CMD /bin/bash
|
||||||
labels:
|
labels:
|
||||||
|
name: debian-{system.release}-{system.architecture}-{%y}{%m}{%d}
|
||||||
description: Debian {system.release} {system.architecture}
|
description: Debian {system.release} {system.architecture}
|
||||||
|
|
|
@ -25,10 +25,13 @@ def resolve_tasks(taskset, manifest):
|
||||||
taskset.update(task_groups.cleanup_group)
|
taskset.update(task_groups.cleanup_group)
|
||||||
|
|
||||||
taskset.update([tasks.commands.AddRequiredCommands,
|
taskset.update([tasks.commands.AddRequiredCommands,
|
||||||
tasks.image.PopulateDockerfileLabels,
|
tasks.image.CreateDockerfileEntry,
|
||||||
tasks.image.CreateDockerfile,
|
|
||||||
tasks.image.CreateImage,
|
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):
|
def resolve_rollback_tasks(taskset, manifest, completed, counter_task):
|
||||||
|
|
|
@ -6,10 +6,6 @@ properties:
|
||||||
provider:
|
provider:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
repository:
|
|
||||||
type: string
|
|
||||||
tag:
|
|
||||||
type: string
|
|
||||||
labels:
|
labels:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
|
@ -25,7 +21,6 @@ properties:
|
||||||
^.+$: {type: string}
|
^.+$: {type: string}
|
||||||
dockerfile:
|
dockerfile:
|
||||||
type: string
|
type: string
|
||||||
required: [repository, tag]
|
|
||||||
system:
|
system:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
|
|
|
@ -3,10 +3,35 @@ from bootstrapvz.common import phases
|
||||||
from bootstrapvz.common.tools import log_check_call
|
from bootstrapvz.common.tools import log_check_call
|
||||||
|
|
||||||
|
|
||||||
class PopulateDockerfileLabels(Task):
|
class CreateDockerfileEntry(Task):
|
||||||
description = 'Populating dockerfile labels'
|
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
|
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
|
@classmethod
|
||||||
def run(cls, info):
|
def run(cls, info):
|
||||||
import pyrfc3339
|
import pyrfc3339
|
||||||
|
@ -22,16 +47,7 @@ class PopulateDockerfileLabels(Task):
|
||||||
if 'labels' in info.manifest.provider:
|
if 'labels' in info.manifest.provider:
|
||||||
for label, value in info.manifest.provider['labels'].items():
|
for label, value in info.manifest.provider['labels'].items():
|
||||||
labels[label] = value.format(**info.manifest_vars)
|
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
|
# pipes.quote converts newlines into \n rather than just prefixing
|
||||||
# it with a backslash, so we need to escape manually
|
# it with a backslash, so we need to escape manually
|
||||||
def escape(value):
|
def escape(value):
|
||||||
|
@ -39,26 +55,17 @@ class CreateDockerfile(Task):
|
||||||
value = value.replace('\n', '\\\n')
|
value = value.replace('\n', '\\\n')
|
||||||
value = '"' + value + '"'
|
value = '"' + value + '"'
|
||||||
return value
|
return value
|
||||||
labels = []
|
kv_pairs = [label + '=' + escape(value) for label, value in labels.items()]
|
||||||
for label, value in info._docker['dockerfile_labels'].items():
|
|
||||||
labels.append(label + '=' + escape(value))
|
|
||||||
# Add some nice newlines and indentation
|
# Add some nice newlines and indentation
|
||||||
info._docker['dockerfile'] = 'LABEL ' + ' \\\n '.join(labels) + '\n'
|
info._docker['dockerfile'] += 'LABEL ' + ' \\\n '.join(kv_pairs) + '\n'
|
||||||
if 'dockerfile' in info.manifest.provider:
|
|
||||||
info._docker['dockerfile'] += info.manifest.provider['dockerfile'] + '\n'
|
|
||||||
|
|
||||||
|
|
||||||
class CreateImage(Task):
|
class AppendManifestDockerfile(Task):
|
||||||
description = 'Creating docker image'
|
description = 'Appending Dockerfile instructions from the manifest'
|
||||||
phase = phases.image_registration
|
phase = phases.image_registration
|
||||||
predecessors = [CreateDockerfile]
|
predecessors = [PopulateLabels]
|
||||||
|
successors = [CreateImage]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def run(cls, info):
|
def run(cls, info):
|
||||||
from pipes import quote
|
info._docker['dockerfile'] += info.manifest.provider['dockerfile'] + '\n'
|
||||||
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)
|
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
name: debian-{system.release}-{system.architecture}-{%y}{%m}{%d}
|
name: debian-{system.release}-{system.architecture}-{%y}{%m}{%d}
|
||||||
provider:
|
provider:
|
||||||
name: docker
|
name: docker
|
||||||
repository: bootstrap-vz
|
|
||||||
tag: latest
|
|
||||||
labels:
|
labels:
|
||||||
description: Debian {system.release} {system.architecture}
|
description: Debian {system.release} {system.architecture}
|
||||||
dockerfile: >
|
dockerfile: >
|
||||||
|
|
Loading…
Add table
Reference in a new issue