docker_daemon: add pull_images option

This commit is contained in:
Johan Euphrosine 2014-10-31 05:32:15 -07:00
parent 880e13f0d8
commit f3a9a1b1ec
3 changed files with 58 additions and 0 deletions

View file

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

View file

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

View file

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