diff --git a/bootstrapvz/plugins/docker_daemon/__init__.py b/bootstrapvz/plugins/docker_daemon/__init__.py index ef3b320..5be1baa 100644 --- a/bootstrapvz/plugins/docker_daemon/__init__.py +++ b/bootstrapvz/plugins/docker_daemon/__init__.py @@ -22,3 +22,4 @@ def resolve_tasks(taskset, manifest): taskset.add(tasks.AddDockerBinary) taskset.add(tasks.AddDockerInit) taskset.add(tasks.EnableMemoryCgroup) + taskset.add(tasks.PullDockerImages) diff --git a/bootstrapvz/plugins/docker_daemon/pull.py b/bootstrapvz/plugins/docker_daemon/pull.py new file mode 100644 index 0000000..ed56169 --- /dev/null +++ b/bootstrapvz/plugins/docker_daemon/pull.py @@ -0,0 +1,43 @@ +import os +import subprocess +import time +import logging + + +def pull(info, images, retries=10): + if len(images) == 0: + return + + bin_docker = os.path.join(info.root, 'usr/bin/docker') + graph_dir = os.path.join(info.root, 'var/lib/docker') + socket = 'unix://' + os.path.join(info.workspace, 'docker.sock') + pidfile = os.path.join(info.workspace, 'docker.pid') + try: + daemon = subprocess.Popen([bin_docker, '-d', '--graph', graph_dir, '-H', socket, '-p', pidfile]) + for _ in range(retries): + if subprocess.call([bin_docker, '-H', socket, 'version']) == 0: + break + time.sleep(1) + for img in images: + if img.endswith('.tar.gz') or img.endswith('.tgz'): + cmd = [bin_docker, '-H', socket, 'load', '-i', img] + logging.debug(' '.join(cmd)) + if subprocess.call(cmd) != 0: + msg = 'error loading docker image {img}.'.format(img=img) + raise Exception(msg) + continue + cmd = [bin_docker, '-H', socket, 'pull', img] + logging.debug('running: %s', ' '.join(cmd)) + if subprocess.call(cmd) != 0: + msg = 'error pulling docker image {img}.'.format(img=img) + raise Exception(msg) + finally: + daemon.terminate() + +if __name__ == '__main__': + class Info(object): + root = '/tmp/bootstrap-vz/root' + workspace = '/tmp/bootstrap-vz/workspace' + + pull_images = ['/usr/local/google/home/proppy/bootstrap-vz/busybox.tar.gz', 'golang:1.3'] + pull(Info(), pull_images) diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index a27a2ca..c003880 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -3,6 +3,7 @@ from bootstrapvz.common import phases from bootstrapvz.common.tasks import boot from bootstrapvz.common.tasks import initd from bootstrapvz.providers.gce.tasks import boot as gceboot +from bootstrapvz.plugins.docker_daemon.pull import pull import os import os.path import shutil @@ -65,3 +66,16 @@ class EnableMemoryCgroup(Task): from bootstrapvz.common.tools import sed_i grub_config = os.path.join(info.root, 'etc/default/grub') sed_i(grub_config, r'^(GRUB_CMDLINE_LINUX*=".*)"\s*$', r'\1 cgroup_enable=memory"') + +class PullDockerImages(Task): + description = 'Pull docker images' + phase = phases.system_modification + predecessors = [AddDockerBinary] + + @classmethod + def run(cls, info): + pull_images = info.manifest.plugins['docker_daemon'].get('pull_images', []) + if len(pull_images) == 0: + return + pull_images_retries = info.manifest.plugins['docker_daemon'].get('pull_images_retries', 10) + pull(info, pull_images, pull_images_retries)