adding "fig pull [SERVICE]" to pull service images

Fixes #158

Signed-off-by: Luke Amdor <luke.amdor@gmail.com>
This commit is contained in:
Luke Amdor 2014-08-15 09:21:41 -05:00
parent dc857a7ad5
commit e51851c884
4 changed files with 24 additions and 1 deletions

View File

@ -85,6 +85,7 @@ class TopLevelCommand(Command):
kill Kill containers kill Kill containers
logs View output from containers logs View output from containers
ps List containers ps List containers
pull Pulls service images
rm Remove stopped containers rm Remove stopped containers
run Run a one-off command run Run a one-off command
scale Set number of containers for a service scale Set number of containers for a service
@ -182,6 +183,14 @@ class TopLevelCommand(Command):
]) ])
print(Formatter().table(headers, rows)) print(Formatter().table(headers, rows))
def pull(self, project, options):
"""
Pulls images for services.
Usage: pull [SERVICE...]
"""
project.pull(service_names=options['SERVICE'])
def rm(self, project, options): def rm(self, project, options):
""" """
Remove stopped service containers. Remove stopped service containers.

View File

@ -176,6 +176,10 @@ class Project(object):
return running_containers return running_containers
def pull(self, service_names=None):
for service in self.get_services(service_names, include_links=True):
service.pull()
def remove_stopped(self, service_names=None, **options): def remove_stopped(self, service_names=None, **options):
for service in self.get_services(service_names): for service in self.get_services(service_names):
service.remove_stopped(**options) service.remove_stopped(**options)

View File

@ -401,6 +401,11 @@ class Service(object):
return False return False
return True return True
def pull(self):
if 'image' in self.options:
log.info('Pulling %s (%s)...' % (self.name, self.options.get('image')))
self.client.pull(self.options.get('image'))
NAME_RE = re.compile(r'^([^_]+)_([^_]+)_(run_)?(\d+)$') NAME_RE = re.compile(r'^([^_]+)_([^_]+)_(run_)?(\d+)$')

View File

@ -51,6 +51,12 @@ class CLITestCase(DockerClientTestCase):
self.assertNotIn('multiplefigfiles_another_1', output) self.assertNotIn('multiplefigfiles_another_1', output)
self.assertIn('multiplefigfiles_yetanother_1', output) self.assertIn('multiplefigfiles_yetanother_1', output)
@patch('fig.service.log')
def test_pull(self, mock_logging):
self.command.dispatch(['pull'], None)
mock_logging.info.assert_any_call('Pulling simple (busybox:latest)...')
mock_logging.info.assert_any_call('Pulling another (busybox:latest)...')
@patch('sys.stdout', new_callable=StringIO) @patch('sys.stdout', new_callable=StringIO)
def test_build_no_cache(self, mock_stdout): def test_build_no_cache(self, mock_stdout):
self.command.base_dir = 'tests/fixtures/simple-dockerfile' self.command.base_dir = 'tests/fixtures/simple-dockerfile'
@ -66,7 +72,6 @@ class CLITestCase(DockerClientTestCase):
self.command.dispatch(['build', '--no-cache', 'simple'], None) self.command.dispatch(['build', '--no-cache', 'simple'], None)
output = mock_stdout.getvalue() output = mock_stdout.getvalue()
self.assertNotIn(cache_indicator, output) self.assertNotIn(cache_indicator, output)
def test_up(self): def test_up(self):
self.command.dispatch(['up', '-d'], None) self.command.dispatch(['up', '-d'], None)
service = self.project.get_service('simple') service = self.project.get_service('simple')