Merge pull request #153 from proppy/docker-vendor

docker_daemon: add pull_images option
This commit is contained in:
Anders Ingemann 2014-11-22 01:44:57 +06:00
commit bc304664f9
2 changed files with 47 additions and 1 deletions

View file

@ -22,3 +22,5 @@ def resolve_tasks(taskset, manifest):
taskset.add(tasks.AddDockerBinary) taskset.add(tasks.AddDockerBinary)
taskset.add(tasks.AddDockerInit) taskset.add(tasks.AddDockerInit)
taskset.add(tasks.EnableMemoryCgroup) taskset.add(tasks.EnableMemoryCgroup)
if len(manifest.plugins['docker_daemon'].get('pull_images', [])) > 0:
taskset.add(tasks.PullDockerImages)

View file

@ -2,10 +2,13 @@ from bootstrapvz.base import Task
from bootstrapvz.common import phases from bootstrapvz.common import phases
from bootstrapvz.common.tasks import boot from bootstrapvz.common.tasks import boot
from bootstrapvz.common.tasks import initd from bootstrapvz.common.tasks import initd
from bootstrapvz.common.tools import log_check_call
from bootstrapvz.providers.gce.tasks import boot as gceboot from bootstrapvz.providers.gce.tasks import boot as gceboot
import os import os
import os.path import os.path
import shutil import shutil
import subprocess
import time
ASSETS_DIR = os.path.normpath(os.path.join(os.path.dirname(__file__), 'assets')) ASSETS_DIR = os.path.normpath(os.path.join(os.path.dirname(__file__), 'assets'))
@ -28,7 +31,6 @@ class AddDockerBinary(Task):
@classmethod @classmethod
def run(cls, info): def run(cls, info):
from bootstrapvz.common.tools import log_check_call
docker_version = info.manifest.plugins['docker_daemon'].get('version', False) docker_version = info.manifest.plugins['docker_daemon'].get('version', False)
docker_url = 'https://get.docker.io/builds/Linux/x86_64/docker-' docker_url = 'https://get.docker.io/builds/Linux/x86_64/docker-'
if docker_version: if docker_version:
@ -65,3 +67,45 @@ class EnableMemoryCgroup(Task):
from bootstrapvz.common.tools import sed_i from bootstrapvz.common.tools import sed_i
grub_config = os.path.join(info.root, 'etc/default/grub') grub_config = os.path.join(info.root, 'etc/default/grub')
sed_i(grub_config, r'^(GRUB_CMDLINE_LINUX*=".*)"\s*$', r'\1 cgroup_enable=memory"') 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):
from bootstrapvz.common.exceptions import TaskError
images = info.manifest.plugins['docker_daemon'].get('pull_images', [])
retries = info.manifest.plugins['docker_daemon'].get('pull_images_retries', 10)
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:
# start docker daemon temporarly.
daemon = subprocess.Popen([bin_docker, '-d', '--graph', graph_dir, '-H', socket, '-p', pidfile])
# wait for docker daemon to start.
for _ in range(retries):
if log_check_call([bin_docker, '-H', socket, 'version']) == 0:
break
time.sleep(1)
for img in images:
# docker load if tarball.
if img.endswith('.tar.gz') or img.endswith('.tgz'):
cmd = [bin_docker, '-H', socket, 'load', '-i', img]
if log_check_call(cmd) != 0:
msg = 'error loading docker image {img}.'.format(img=img)
raise TaskError(msg)
# docker pull if image name.
else:
cmd = [bin_docker, '-H', socket, 'pull', img]
if log_check_call(cmd) != 0:
msg = 'error pulling docker image {img}.'.format(img=img)
raise TaskError(msg)
finally:
# shutdown docker daemon.
daemon.terminate()