From 49ddd3879f29f82b0c59c3cfd1555ba00767cfc4 Mon Sep 17 00:00:00 2001 From: Anders Ingemann Date: Sun, 5 Jun 2016 17:19:27 +0200 Subject: [PATCH] docker: Fix dockerfile creation --- bootstrapvz/providers/docker/README.rst | 8 ++++---- bootstrapvz/providers/docker/manifest-schema.yml | 6 +++++- bootstrapvz/providers/docker/tasks/image.py | 15 ++++++++------- manifests/examples/docker/jessie-minimized.yml | 4 ++-- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/bootstrapvz/providers/docker/README.rst b/bootstrapvz/providers/docker/README.rst index f7fb836..c907bb5 100644 --- a/bootstrapvz/providers/docker/README.rst +++ b/bootstrapvz/providers/docker/README.rst @@ -26,8 +26,8 @@ Name Provider ~~~~~~~~ -- ``dockerfile``: Inline dockerfile that should be appended to - the one created by the bootstrapper. +- ``dockerfile``: List of Dockerfile instructions that should be appended to + the ones created by the bootstrapper. ``optional`` - ``labels``: Labels that should be added to the dockerfile. @@ -49,8 +49,8 @@ Example: name: bootstrap-vz:latest provider: name: docker - dockerfile: > - CMD /bin/bash + 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/manifest-schema.yml b/bootstrapvz/providers/docker/manifest-schema.yml index 4b3506e..c985419 100644 --- a/bootstrapvz/providers/docker/manifest-schema.yml +++ b/bootstrapvz/providers/docker/manifest-schema.yml @@ -20,7 +20,11 @@ properties: patternProperties: ^.+$: {type: string} dockerfile: - type: string + type: array + items: + # https://github.com/turtlebender/docker/blob/6e2662b3bad319679e17fe25d410f246820ab0e9/builder/job.go#L27 + type: string + pattern: '^(ENTRYPOINT|CMD|USER|WORKDIR|ENV|VOLUME|EXPOSE|ONBUILD|LABEL|MAINTAINER)' system: type: object properties: diff --git a/bootstrapvz/providers/docker/tasks/image.py b/bootstrapvz/providers/docker/tasks/image.py index 6093327..f4555e7 100644 --- a/bootstrapvz/providers/docker/tasks/image.py +++ b/bootstrapvz/providers/docker/tasks/image.py @@ -9,7 +9,7 @@ class CreateDockerfileEntry(Task): @classmethod def run(cls, info): - info._docker['dockerfile'] = '' + info._docker['dockerfile'] = [] class CreateImage(Task): @@ -21,8 +21,10 @@ class CreateImage(Task): 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.format(**info.manifest_vars)] + docker_cmd = ['docker', 'import'] + for instruction in info._docker['dockerfile']: + docker_cmd.extend(['--change', instruction]) + docker_cmd.extend(['-', info.manifest.name.format(**info.manifest_vars)]) cmd = ' '.join(map(quote, tar_cmd)) + ' | ' + ' '.join(map(quote, docker_cmd)) [info._docker['image_id']] = log_check_call([cmd], shell=True) @@ -55,9 +57,8 @@ class PopulateLabels(Task): value = value.replace('\n', '\\\n') value = '"' + value + '"' return value - kv_pairs = [label + '=' + escape(value) for label, value in labels.items()] - # Add some nice newlines and indentation - info._docker['dockerfile'] += 'LABEL ' + ' \\\n '.join(kv_pairs) + '\n' + for label, value in labels.items(): + info._docker['dockerfile'].append('LABEL {}={}'.format(label, escape(value))) class AppendManifestDockerfile(Task): @@ -68,4 +69,4 @@ class AppendManifestDockerfile(Task): @classmethod def run(cls, info): - info._docker['dockerfile'] += info.manifest.provider['dockerfile'] + '\n' + info._docker['dockerfile'].extend(info.manifest.provider['dockerfile']) diff --git a/manifests/examples/docker/jessie-minimized.yml b/manifests/examples/docker/jessie-minimized.yml index 6405956..381361e 100644 --- a/manifests/examples/docker/jessie-minimized.yml +++ b/manifests/examples/docker/jessie-minimized.yml @@ -4,8 +4,8 @@ provider: name: docker labels: description: Debian {system.release} {system.architecture} - dockerfile: > - CMD /bin/bash + dockerfile: + - CMD /bin/bash bootstrapper: workspace: /target variant: minbase