Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b51b175

Browse files
committedDec 20, 2014
Add a no-build option to fig up, to save time when services were already freshly built.
Signed-off-by: Daniel Nephin <dnephin@gmail.com>
1 parent 9d74033 commit b51b175

File tree

5 files changed

+52
-19
lines changed

5 files changed

+52
-19
lines changed
 

‎fig/cli/main.py

+2
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ def up(self, project, options):
423423
--no-color Produce monochrome output.
424424
--no-deps Don't start linked services.
425425
--no-recreate If containers already exist, don't recreate them.
426+
--no-build Don't build an image if it's missing
426427
"""
427428
insecure_registry = options['--allow-insecure-ssl']
428429
detached = options['-d']
@@ -438,6 +439,7 @@ def up(self, project, options):
438439
start_links=start_links,
439440
recreate=recreate,
440441
insecure_registry=insecure_registry,
442+
do_build=not options['--no-build'],
441443
)
442444

443445
to_attach = [c for s in project.get_services(service_names) for c in s.containers()]

‎fig/project.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,23 @@ def build(self, service_names=None, no_cache=False):
167167
else:
168168
log.info('%s uses an image, skipping' % service.name)
169169

170-
def up(self, service_names=None, start_links=True, recreate=True, insecure_registry=False):
170+
def up(self,
171+
service_names=None,
172+
start_links=True,
173+
recreate=True,
174+
insecure_registry=False,
175+
do_build=True):
171176
running_containers = []
172177
for service in self.get_services(service_names, include_links=start_links):
173178
if recreate:
174-
for (_, container) in service.recreate_containers(insecure_registry=insecure_registry):
179+
for (_, container) in service.recreate_containers(
180+
insecure_registry=insecure_registry,
181+
do_build=do_build):
175182
running_containers.append(container)
176183
else:
177-
for container in service.start_or_create_containers(insecure_registry=insecure_registry):
184+
for container in service.start_or_create_containers(
185+
insecure_registry=insecure_registry,
186+
do_build=do_build):
178187
running_containers.append(container)
179188

180189
return running_containers

‎fig/service.py

+11-6
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
'cap_add',
5555
'cap_drop',
5656
'dns',
57-
'dns_search',
57+
'dns_search',
5858
'env_file',
5959
'net',
6060
'privileged',
@@ -236,15 +236,18 @@ def create_container(self,
236236
return Container.create(self.client, **container_options)
237237
raise
238238

239-
def recreate_containers(self, insecure_registry=False, **override_options):
239+
def recreate_containers(self, insecure_registry=False, do_build=True, **override_options):
240240
"""
241241
If a container for this service doesn't exist, create and start one. If there are
242242
any, stop them, create+start new ones, and remove the old containers.
243243
"""
244244
containers = self.containers(stopped=True)
245245
if not containers:
246246
log.info("Creating %s..." % self._next_container_name(containers))
247-
container = self.create_container(insecure_registry=insecure_registry, **override_options)
247+
container = self.create_container(
248+
insecure_registry=insecure_registry,
249+
do_build=do_build,
250+
**override_options)
248251
self.start_container(container)
249252
return [(None, container)]
250253
else:
@@ -282,7 +285,7 @@ def recreate_container(self, container, **override_options):
282285
container.remove()
283286

284287
options = dict(override_options)
285-
new_container = self.create_container(**options)
288+
new_container = self.create_container(do_build=False, **options)
286289
self.start_container(new_container, intermediate_container=intermediate_container)
287290

288291
intermediate_container.remove()
@@ -329,12 +332,14 @@ def start_container(self, container, intermediate_container=None, **override_opt
329332
)
330333
return container
331334

332-
def start_or_create_containers(self, insecure_registry=False):
335+
def start_or_create_containers(self, insecure_registry=False, do_build=True):
333336
containers = self.containers(stopped=True)
334337

335338
if not containers:
336339
log.info("Creating %s..." % self._next_container_name(containers))
337-
new_container = self.create_container(insecure_registry=insecure_registry)
340+
new_container = self.create_container(
341+
insecure_registry=insecure_registry,
342+
do_build=do_build)
338343
return [self.start_container(new_container)]
339344
else:
340345
return [self.start_container_if_stopped(c) for c in containers]

‎tests/integration/service_test.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -383,24 +383,24 @@ def test_dns_list(self):
383383

384384
def test_restart_always_value(self):
385385
service = self.create_service('web', restart='always')
386-
container = service.start_container().inspect()
387-
self.assertEqual(container['HostConfig']['RestartPolicy']['Name'], 'always')
386+
container = create_and_start_container(service)
387+
self.assertEqual(container.get('HostConfig.RestartPolicy.Name'), 'always')
388388

389389
def test_restart_on_failure_value(self):
390390
service = self.create_service('web', restart='on-failure:5')
391-
container = service.start_container().inspect()
392-
self.assertEqual(container['HostConfig']['RestartPolicy']['Name'], 'on-failure')
393-
self.assertEqual(container['HostConfig']['RestartPolicy']['MaximumRetryCount'], 5)
391+
container = create_and_start_container(service)
392+
self.assertEqual(container.get('HostConfig.RestartPolicy.Name'), 'on-failure')
393+
self.assertEqual(container.get('HostConfig.RestartPolicy.MaximumRetryCount'), 5)
394394

395395
def test_cap_add_list(self):
396396
service = self.create_service('web', cap_add=['SYS_ADMIN', 'NET_ADMIN'])
397-
container = service.start_container().inspect()
398-
self.assertEqual(container['HostConfig']['CapAdd'], ['SYS_ADMIN', 'NET_ADMIN'])
397+
container = create_and_start_container(service)
398+
self.assertEqual(container.get('HostConfig.CapAdd'), ['SYS_ADMIN', 'NET_ADMIN'])
399399

400400
def test_cap_drop_list(self):
401401
service = self.create_service('web', cap_drop=['SYS_ADMIN', 'NET_ADMIN'])
402-
container = service.start_container().inspect()
403-
self.assertEqual(container['HostConfig']['CapDrop'], ['SYS_ADMIN', 'NET_ADMIN'])
402+
container = create_and_start_container(service)
403+
self.assertEqual(container.get('HostConfig.CapDrop'), ['SYS_ADMIN', 'NET_ADMIN'])
404404

405405
def test_dns_search_single_value(self):
406406
service = self.create_service('web', dns_search='example.com')
@@ -425,7 +425,7 @@ def test_split_env(self):
425425

426426
def test_env_from_file_combined_with_env(self):
427427
service = self.create_service('web', environment=['ONE=1', 'TWO=2', 'THREE=3'], env_file=['tests/fixtures/env/one.env', 'tests/fixtures/env/two.env'])
428-
env = service.start_container().environment
428+
env = create_and_start_container(service).environment
429429
for k,v in {'ONE': '1', 'TWO': '2', 'THREE': '3', 'FOO': 'baz', 'DOO': 'dah'}.iteritems():
430430
self.assertEqual(env[k], v)
431431

‎tests/unit/service_test.py

+17
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,23 @@ def test_latest_is_used_when_tag_is_not_specified(self):
228228
service.create_container()
229229
self.assertEqual(Container.create.call_args[1]['image'], 'someimage:latest')
230230

231+
def test_create_container_with_build(self):
232+
self.mock_client.images.return_value = []
233+
service = Service('foo', client=self.mock_client, build='.')
234+
service.build = mock.create_autospec(service.build)
235+
service.create_container(do_build=True)
236+
237+
self.mock_client.images.assert_called_once_with(name=service.full_name)
238+
service.build.assert_called_once_with()
239+
240+
def test_create_container_no_build(self):
241+
self.mock_client.images.return_value = []
242+
service = Service('foo', client=self.mock_client, build='.')
243+
service.create_container(do_build=False)
244+
245+
self.assertFalse(self.mock_client.images.called)
246+
self.assertFalse(self.mock_client.build.called)
247+
231248

232249
class ServiceVolumesTest(unittest.TestCase):
233250

0 commit comments

Comments
 (0)
Please sign in to comment.