Add new --pull option in build.

Signed-off-by: Christophe Labouisse <christophe@labouisse.org>
This commit is contained in:
Christophe Labouisse 2015-09-14 15:02:15 +02:00
parent dbc68ca747
commit 39786d4da7
5 changed files with 49 additions and 10 deletions

View File

@ -153,9 +153,11 @@ class TopLevelCommand(Command):
Options: Options:
--no-cache Do not use cache when building the image. --no-cache Do not use cache when building the image.
--pull Always attempt to pull a newer version of the image.
""" """
no_cache = bool(options.get('--no-cache', False)) no_cache = bool(options.get('--no-cache', False))
project.build(service_names=options['SERVICE'], no_cache=no_cache) pull = bool(options.get('--pull', False))
project.build(service_names=options['SERVICE'], no_cache=no_cache, pull=pull)
def help(self, project, options): def help(self, project, options):
""" """

View File

@ -257,10 +257,10 @@ class Project(object):
for service in self.get_services(service_names): for service in self.get_services(service_names):
service.restart(**options) service.restart(**options)
def build(self, service_names=None, no_cache=False): def build(self, service_names=None, no_cache=False, pull=False):
for service in self.get_services(service_names): for service in self.get_services(service_names):
if service.can_be_built(): if service.can_be_built():
service.build(no_cache) service.build(no_cache, pull)
else: else:
log.info('%s uses an image, skipping' % service.name) log.info('%s uses an image, skipping' % service.name)

View File

@ -700,7 +700,7 @@ class Service(object):
security_opt=security_opt security_opt=security_opt
) )
def build(self, no_cache=False): def build(self, no_cache=False, pull=False):
log.info('Building %s' % self.name) log.info('Building %s' % self.name)
path = self.options['build'] path = self.options['build']
@ -714,7 +714,7 @@ class Service(object):
tag=self.image_name, tag=self.image_name,
stream=True, stream=True,
rm=True, rm=True,
pull=False, pull=pull,
nocache=no_cache, nocache=no_cache,
dockerfile=self.options.get('dockerfile', None), dockerfile=self.options.get('dockerfile', None),
) )

View File

@ -16,6 +16,7 @@ Usage: build [options] [SERVICE...]
Options: Options:
--no-cache Do not use cache when building the image. --no-cache Do not use cache when building the image.
--pull Always attempt to pull a newer version of the image.
``` ```
Services are built once and then tagged as `project_service`, e.g., Services are built once and then tagged as `project_service`, e.g.,

View File

@ -97,6 +97,19 @@ class CLITestCase(DockerClientTestCase):
'Pulling digest (busybox@' 'Pulling digest (busybox@'
'sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d)...') 'sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d)...')
@mock.patch('sys.stdout', new_callable=StringIO)
def test_build_plain(self, mock_stdout):
self.command.base_dir = 'tests/fixtures/simple-dockerfile'
self.command.dispatch(['build', 'simple'], None)
mock_stdout.truncate(0)
cache_indicator = 'Using cache'
pull_indicator = 'Status: Image is up to date for busybox:latest'
self.command.dispatch(['build', 'simple'], None)
output = mock_stdout.getvalue()
self.assertIn(cache_indicator, output)
self.assertNotIn(pull_indicator, output)
@mock.patch('sys.stdout', new_callable=StringIO) @mock.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'
@ -104,14 +117,37 @@ class CLITestCase(DockerClientTestCase):
mock_stdout.truncate(0) mock_stdout.truncate(0)
cache_indicator = 'Using cache' cache_indicator = 'Using cache'
self.command.dispatch(['build', 'simple'], None) pull_indicator = 'Status: Image is up to date for busybox:latest'
output = mock_stdout.getvalue()
self.assertIn(cache_indicator, output)
mock_stdout.truncate(0)
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)
self.assertNotIn(pull_indicator, output)
@mock.patch('sys.stdout', new_callable=StringIO)
def test_build_pull(self, mock_stdout):
self.command.base_dir = 'tests/fixtures/simple-dockerfile'
self.command.dispatch(['build', 'simple'], None)
mock_stdout.truncate(0)
cache_indicator = 'Using cache'
pull_indicator = 'Status: Image is up to date for busybox:latest'
self.command.dispatch(['build', '--pull', 'simple'], None)
output = mock_stdout.getvalue()
self.assertIn(cache_indicator, output)
self.assertIn(pull_indicator, output)
@mock.patch('sys.stdout', new_callable=StringIO)
def test_build_no_cache_pull(self, mock_stdout):
self.command.base_dir = 'tests/fixtures/simple-dockerfile'
self.command.dispatch(['build', 'simple'], None)
mock_stdout.truncate(0)
cache_indicator = 'Using cache'
pull_indicator = 'Status: Image is up to date for busybox:latest'
self.command.dispatch(['build', '--no-cache', '--pull', 'simple'], None)
output = mock_stdout.getvalue()
self.assertNotIn(cache_indicator, output)
self.assertIn(pull_indicator, output)
def test_up_detached(self): def test_up_detached(self):
self.command.dispatch(['up', '-d'], None) self.command.dispatch(['up', '-d'], None)