From f3a9a1b1ec6662da9540985507ce4390c8f060ac Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Fri, 31 Oct 2014 05:32:15 -0700 Subject: [PATCH 1/9] docker_daemon: add pull_images option --- bootstrapvz/plugins/docker_daemon/__init__.py | 1 + bootstrapvz/plugins/docker_daemon/pull.py | 43 +++++++++++++++++++ bootstrapvz/plugins/docker_daemon/tasks.py | 14 ++++++ 3 files changed, 58 insertions(+) create mode 100644 bootstrapvz/plugins/docker_daemon/pull.py 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) From 962532065c45b06753c91be38e8e1cb3894bd798 Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Wed, 19 Nov 2014 11:49:17 -0800 Subject: [PATCH 2/9] bootstrapvz/plugins/docker_daemon: flake8 --- bootstrapvz/plugins/docker_daemon/pull.py | 61 +++++++++------------- bootstrapvz/plugins/docker_daemon/tasks.py | 1 + 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/bootstrapvz/plugins/docker_daemon/pull.py b/bootstrapvz/plugins/docker_daemon/pull.py index ed56169..8edd134 100644 --- a/bootstrapvz/plugins/docker_daemon/pull.py +++ b/bootstrapvz/plugins/docker_daemon/pull.py @@ -1,43 +1,32 @@ import os import subprocess import time -import logging def pull(info, images, retries=10): - if len(images) == 0: - return + 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) + 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] + 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] + if subprocess.call(cmd) != 0: + msg = 'error pulling docker image {img}.'.format(img=img) + raise Exception(msg) + finally: + daemon.terminate() diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index c003880..75f8c10 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -67,6 +67,7 @@ class EnableMemoryCgroup(Task): 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 From feb4d093c9ab99690ee0a2a30de0e82e5635e029 Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Wed, 19 Nov 2014 11:53:23 -0800 Subject: [PATCH 3/9] bootstrapvz/plugins/docker_daemon: spaces to tabs --- bootstrapvz/plugins/docker_daemon/tasks.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index 75f8c10..9172187 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -15,7 +15,7 @@ class AddDockerDeps(Task): description = 'Add packages for docker deps' phase = phases.package_installation DOCKER_DEPS = ['aufs-tools', 'btrfs-tools', 'git', 'iptables', - 'procps', 'xz-utils', 'ca-certificates'] + 'procps', 'xz-utils', 'ca-certificates'] @classmethod def run(cls, info): @@ -75,8 +75,8 @@ class PullDockerImages(Task): @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) + 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) From 31ba98821cfeab2c0509542d41b19494e528dbb4 Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Wed, 19 Nov 2014 16:14:41 -0800 Subject: [PATCH 4/9] plugins/docker_daemon: logcheckcall, inline pull and indent --- bootstrapvz/plugins/docker_daemon/pull.py | 32 ---------------------- bootstrapvz/plugins/docker_daemon/tasks.py | 32 +++++++++++++++++++--- 2 files changed, 28 insertions(+), 36 deletions(-) delete mode 100644 bootstrapvz/plugins/docker_daemon/pull.py diff --git a/bootstrapvz/plugins/docker_daemon/pull.py b/bootstrapvz/plugins/docker_daemon/pull.py deleted file mode 100644 index 8edd134..0000000 --- a/bootstrapvz/plugins/docker_daemon/pull.py +++ /dev/null @@ -1,32 +0,0 @@ -import os -import subprocess -import time - - -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] - 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] - if subprocess.call(cmd) != 0: - msg = 'error pulling docker image {img}.'.format(img=img) - raise Exception(msg) - finally: - daemon.terminate() diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index 9172187..2d061da 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -2,6 +2,7 @@ from bootstrapvz.base import Task from bootstrapvz.common import phases from bootstrapvz.common.tasks import boot 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.plugins.docker_daemon.pull import pull import os @@ -29,7 +30,6 @@ class AddDockerBinary(Task): @classmethod def run(cls, info): - from bootstrapvz.common.tools import log_check_call docker_version = info.manifest.plugins['docker_daemon'].get('version', False) docker_url = 'https://get.docker.io/builds/Linux/x86_64/docker-' if docker_version: @@ -75,8 +75,32 @@ class PullDockerImages(Task): @classmethod def run(cls, info): - pull_images = info.manifest.plugins['docker_daemon'].get('pull_images', []) + 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) + 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: + daemon = subprocess.Popen([bin_docker, '-d', '--graph', graph_dir, '-H', socket, '-p', pidfile]) + for _ in range(retries): + if log_check_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] + if lock_check_call(cmd) != 0: + msg = 'error loading docker image {img}.'.format(img=img) + raise Exception(msg) + else: # regular docker image + cmd = [bin_docker, '-H', socket, 'pull', img] + if lock_check_call(cmd) != 0: + msg = 'error pulling docker image {img}.'.format(img=img) + raise Exception(msg) + finally: + daemon.terminate() From 6fdf0cc403268a88ed08bd6ba091cb9b23be2191 Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Wed, 19 Nov 2014 16:16:26 -0800 Subject: [PATCH 5/9] plugins/docker_daemon: align with space --- bootstrapvz/plugins/docker_daemon/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index 2d061da..9620f8d 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -16,7 +16,7 @@ class AddDockerDeps(Task): description = 'Add packages for docker deps' phase = phases.package_installation DOCKER_DEPS = ['aufs-tools', 'btrfs-tools', 'git', 'iptables', - 'procps', 'xz-utils', 'ca-certificates'] + 'procps', 'xz-utils', 'ca-certificates'] @classmethod def run(cls, info): From e53e727c9cd6c75883e7a67aa51223f0bf5a88d2 Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Wed, 19 Nov 2014 16:21:38 -0800 Subject: [PATCH 6/9] plugins/docker_daemon: only add PullDockerImages tasks when pull_images is set --- bootstrapvz/plugins/docker_daemon/__init__.py | 3 ++- bootstrapvz/plugins/docker_daemon/tasks.py | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/bootstrapvz/plugins/docker_daemon/__init__.py b/bootstrapvz/plugins/docker_daemon/__init__.py index 5be1baa..637163e 100644 --- a/bootstrapvz/plugins/docker_daemon/__init__.py +++ b/bootstrapvz/plugins/docker_daemon/__init__.py @@ -22,4 +22,5 @@ def resolve_tasks(taskset, manifest): taskset.add(tasks.AddDockerBinary) taskset.add(tasks.AddDockerInit) taskset.add(tasks.EnableMemoryCgroup) - taskset.add(tasks.PullDockerImages) + if len(manifest.plugins['docker_daemon'].get('pull_images', [])) > 0: + taskset.add(tasks.PullDockerImages) diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index 9620f8d..c2bb25e 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -76,8 +76,6 @@ class PullDockerImages(Task): @classmethod def run(cls, info): images = info.manifest.plugins['docker_daemon'].get('pull_images', []) - if len(pull_images) == 0: - return retries = info.manifest.plugins['docker_daemon'].get('pull_images_retries', 10) bin_docker = os.path.join(info.root, 'usr/bin/docker') From 99786539c7ba3edfc26d21cc74f310943a29c312 Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Wed, 19 Nov 2014 16:25:27 -0800 Subject: [PATCH 7/9] plugins/docker_daemon: flake8 --- bootstrapvz/plugins/docker_daemon/tasks.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index c2bb25e..d317f66 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -4,10 +4,11 @@ from bootstrapvz.common.tasks import boot 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.plugins.docker_daemon.pull import pull import os import os.path import shutil +import subprocess +import time ASSETS_DIR = os.path.normpath(os.path.join(os.path.dirname(__file__), 'assets')) @@ -16,7 +17,7 @@ class AddDockerDeps(Task): description = 'Add packages for docker deps' phase = phases.package_installation DOCKER_DEPS = ['aufs-tools', 'btrfs-tools', 'git', 'iptables', - 'procps', 'xz-utils', 'ca-certificates'] + 'procps', 'xz-utils', 'ca-certificates'] @classmethod def run(cls, info): @@ -92,12 +93,12 @@ class PullDockerImages(Task): for img in images: if img.endswith('.tar.gz') or img.endswith('.tgz'): cmd = [bin_docker, '-H', socket, 'load', '-i', img] - if lock_check_call(cmd) != 0: + if log_check_call(cmd) != 0: msg = 'error loading docker image {img}.'.format(img=img) raise Exception(msg) - else: # regular docker image + else: # regular docker image cmd = [bin_docker, '-H', socket, 'pull', img] - if lock_check_call(cmd) != 0: + if log_check_call(cmd) != 0: msg = 'error pulling docker image {img}.'.format(img=img) raise Exception(msg) finally: From 141e6399f34a12f828d0799e0ee759b10c9b7be3 Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Fri, 21 Nov 2014 10:51:03 -0800 Subject: [PATCH 8/9] fix ident, raise TaskError --- bootstrapvz/plugins/docker_daemon/tasks.py | 51 +++++++++++----------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index d317f66..00046e4 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -76,30 +76,31 @@ class PullDockerImages(Task): @classmethod def run(cls, info): - images = info.manifest.plugins['docker_daemon'].get('pull_images', []) - retries = info.manifest.plugins['docker_daemon'].get('pull_images_retries', 10) + 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') + 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 log_check_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] - if log_check_call(cmd) != 0: - msg = 'error loading docker image {img}.'.format(img=img) - raise Exception(msg) - else: # regular docker image - cmd = [bin_docker, '-H', socket, 'pull', img] - if log_check_call(cmd) != 0: - msg = 'error pulling docker image {img}.'.format(img=img) - raise Exception(msg) - finally: - daemon.terminate() + try: + daemon = subprocess.Popen([bin_docker, '-d', '--graph', graph_dir, '-H', socket, '-p', pidfile]) + for _ in range(retries): + if log_check_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] + if log_check_call(cmd) != 0: + msg = 'error loading docker image {img}.'.format(img=img) + raise TaskError(msg) + else: # regular docker image + 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: + daemon.terminate() From e4663f4fbe4b4692265c83811dd8b5c526607b05 Mon Sep 17 00:00:00 2001 From: Johan Euphrosine Date: Fri, 21 Nov 2014 11:22:11 -0800 Subject: [PATCH 9/9] docker_daemon: add comments --- bootstrapvz/plugins/docker_daemon/tasks.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bootstrapvz/plugins/docker_daemon/tasks.py b/bootstrapvz/plugins/docker_daemon/tasks.py index 00046e4..269e143 100644 --- a/bootstrapvz/plugins/docker_daemon/tasks.py +++ b/bootstrapvz/plugins/docker_daemon/tasks.py @@ -86,21 +86,26 @@ class PullDockerImages(Task): 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) - else: # regular docker image + # 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()