Skip to content
This repository was archived by the owner on Apr 18, 2018. It is now read-only.

Commit 2f80545

Browse files
committed
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 b0fd594 commit 2f80545

File tree

5 files changed

+51
-18
lines changed

5 files changed

+51
-18
lines changed

fig/cli/main.py

+2
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ def up(self, project, options):
417417
--no-color Produce monochrome output.
418418
--no-deps Don't start linked services.
419419
--no-recreate If containers already exist, don't recreate them.
420+
--no-build Don't build an image if it's missing
420421
"""
421422
insecure_registry = options['--allow-insecure-ssl']
422423
detached = options['-d']
@@ -432,6 +433,7 @@ def up(self, project, options):
432433
start_links=start_links,
433434
recreate=recreate,
434435
insecure_registry=insecure_registry,
436+
do_build=not options['--no-build'],
435437
)
436438

437439
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

+10-5
Original file line numberDiff line numberDiff line change
@@ -211,15 +211,18 @@ def create_container(self,
211211
return Container.create(self.client, **container_options)
212212
raise
213213

214-
def recreate_containers(self, insecure_registry=False, **override_options):
214+
def recreate_containers(self, insecure_registry=False, do_build=True, **override_options):
215215
"""
216216
If a container for this service doesn't exist, create and start one. If there are
217217
any, stop them, create+start new ones, and remove the old containers.
218218
"""
219219
containers = self.containers(stopped=True)
220220
if not containers:
221221
log.info("Creating %s..." % self._next_container_name(containers))
222-
container = self.create_container(insecure_registry=insecure_registry, **override_options)
222+
container = self.create_container(
223+
insecure_registry=insecure_registry,
224+
do_build=do_build,
225+
**override_options)
223226
self.start_container(container)
224227
return [(None, container)]
225228
else:
@@ -257,7 +260,7 @@ def recreate_container(self, container, **override_options):
257260
container.remove()
258261

259262
options = dict(override_options)
260-
new_container = self.create_container(**options)
263+
new_container = self.create_container(do_build=False, **options)
261264
self.start_container(new_container, intermediate_container=intermediate_container)
262265

263266
intermediate_container.remove()
@@ -302,12 +305,14 @@ def start_container(self, container, intermediate_container=None, **override_opt
302305
)
303306
return container
304307

305-
def start_or_create_containers(self, insecure_registry=False):
308+
def start_or_create_containers(self, insecure_registry=False, do_build=True):
306309
containers = self.containers(stopped=True)
307310

308311
if not containers:
309312
log.info("Creating %s..." % self._next_container_name(containers))
310-
new_container = self.create_container(insecure_registry=insecure_registry)
313+
new_container = self.create_container(
314+
insecure_registry=insecure_registry,
315+
do_build=do_build)
311316
return [self.start_container(new_container)]
312317
else:
313318
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
@@ -372,24 +372,24 @@ def test_dns_list(self):
372372

373373
def test_restart_always_value(self):
374374
service = self.create_service('web', restart='always')
375-
container = service.start_container().inspect()
376-
self.assertEqual(container['HostConfig']['RestartPolicy']['Name'], 'always')
375+
container = create_and_start_container(service)
376+
self.assertEqual(container.get('HostConfig.RestartPolicy.Name'), 'always')
377377

378378
def test_restart_on_failure_value(self):
379379
service = self.create_service('web', restart='on-failure:5')
380-
container = service.start_container().inspect()
381-
self.assertEqual(container['HostConfig']['RestartPolicy']['Name'], 'on-failure')
382-
self.assertEqual(container['HostConfig']['RestartPolicy']['MaximumRetryCount'], 5)
380+
container = create_and_start_container(service)
381+
self.assertEqual(container.get('HostConfig.RestartPolicy.Name'), 'on-failure')
382+
self.assertEqual(container.get('HostConfig.RestartPolicy.MaximumRetryCount'), 5)
383383

384384
def test_cap_add_list(self):
385385
service = self.create_service('web', cap_add=['SYS_ADMIN', 'NET_ADMIN'])
386-
container = service.start_container().inspect()
387-
self.assertEqual(container['HostConfig']['CapAdd'], ['SYS_ADMIN', 'NET_ADMIN'])
386+
container = create_and_start_container(service)
387+
self.assertEqual(container.get('HostConfig.CapAdd'), ['SYS_ADMIN', 'NET_ADMIN'])
388388

389389
def test_cap_drop_list(self):
390390
service = self.create_service('web', cap_drop=['SYS_ADMIN', 'NET_ADMIN'])
391-
container = service.start_container().inspect()
392-
self.assertEqual(container['HostConfig']['CapDrop'], ['SYS_ADMIN', 'NET_ADMIN'])
391+
container = create_and_start_container(service)
392+
self.assertEqual(container.get('HostConfig.CapDrop'), ['SYS_ADMIN', 'NET_ADMIN'])
393393

394394
def test_working_dir_param(self):
395395
service = self.create_service('container', working_dir='/working/dir/sample')
@@ -404,7 +404,7 @@ def test_split_env(self):
404404

405405
def test_env_from_file_combined_with_env(self):
406406
service = self.create_service('web', environment=['ONE=1', 'TWO=2', 'THREE=3'], env_file=['tests/fixtures/env/one.env', 'tests/fixtures/env/two.env'])
407-
env = service.start_container().environment
407+
env = create_and_start_container(service).environment
408408
for k,v in {'ONE': '1', 'TWO': '2', 'THREE': '3', 'FOO': 'baz', 'DOO': 'dah'}.iteritems():
409409
self.assertEqual(env[k], v)
410410

tests/unit/service_test.py

+17
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,23 @@ def test_create_container_from_insecure_registry(
215215
mock_log.info.assert_called_once_with(
216216
'Pulling image someimage:sometag...')
217217

218+
def test_create_container_with_build(self):
219+
self.mock_client.images.return_value = []
220+
service = Service('foo', client=self.mock_client, build='.')
221+
service.build = mock.create_autospec(service.build)
222+
service.create_container(do_build=True)
223+
224+
self.mock_client.images.assert_called_once_with(name=service.full_name)
225+
service.build.assert_called_once_with()
226+
227+
def test_create_container_no_build(self):
228+
self.mock_client.images.return_value = []
229+
service = Service('foo', client=self.mock_client, build='.')
230+
service.create_container(do_build=False)
231+
232+
self.assertFalse(self.mock_client.images.called)
233+
self.assertFalse(self.mock_client.build.called)
234+
218235

219236
class ServiceVolumesTest(unittest.TestCase):
220237

0 commit comments

Comments
 (0)