diff --git a/compose/config.py b/compose/config.py index f87da1d8c..50ac5b606 100644 --- a/compose/config.py +++ b/compose/config.py @@ -64,6 +64,7 @@ def from_dictionary(dictionary, working_dir=None, filename=None): raise ConfigurationError('Service "%s" doesn\'t have any configuration options. All top level keys in your docker-compose.yml must map to a dictionary of configuration options.' % service_name) loader = ServiceLoader(working_dir=working_dir, filename=filename) service_dict = loader.make_service_dict(service_name, service_dict) + validate_paths(service_dict) service_dicts.append(service_dict) return service_dicts @@ -339,12 +340,14 @@ def resolve_host_path(volume, working_dir): def resolve_build_path(build_path, working_dir=None): if working_dir is None: raise Exception("No working_dir passed to resolve_build_path") + return expand_path(working_dir, build_path) - _path = expand_path(working_dir, build_path) - if not os.path.exists(_path) or not os.access(_path, os.R_OK): - raise ConfigurationError("build path %s either does not exist or is not accessible." % _path) - else: - return _path + +def validate_paths(service_dict): + if 'build' in service_dict: + build_path = service_dict['build'] + if not os.path.exists(build_path) or not os.access(build_path, os.R_OK): + raise ConfigurationError("build path %s either does not exist or is not accessible." % build_path) def merge_volumes(base, override): diff --git a/tests/fixtures/extends/nonexistent-path-base.yml b/tests/fixtures/extends/nonexistent-path-base.yml new file mode 100644 index 000000000..1cf9a304a --- /dev/null +++ b/tests/fixtures/extends/nonexistent-path-base.yml @@ -0,0 +1,6 @@ +dnebase: + build: nonexistent.path + command: /bin/true + environment: + - FOO=1 + - BAR=1 \ No newline at end of file diff --git a/tests/fixtures/extends/nonexistent-path-child.yml b/tests/fixtures/extends/nonexistent-path-child.yml new file mode 100644 index 000000000..aab11459b --- /dev/null +++ b/tests/fixtures/extends/nonexistent-path-child.yml @@ -0,0 +1,8 @@ +dnechild: + extends: + file: nonexistent-path-base.yml + service: dnebase + image: busybox + command: /bin/true + environment: + - BAR=2 \ No newline at end of file diff --git a/tests/unit/config_test.py b/tests/unit/config_test.py index 97bd1b91d..12610f102 100644 --- a/tests/unit/config_test.py +++ b/tests/unit/config_test.py @@ -398,6 +398,21 @@ class ExtendsTest(unittest.TestCase): self.assertEqual(set(dicts[0]['volumes']), set(paths)) + def test_parent_build_path_dne(self): + child = config.load('tests/fixtures/extends/nonexistent-path-child.yml') + + self.assertEqual(child, [ + { + 'name': 'dnechild', + 'image': 'busybox', + 'command': '/bin/true', + 'environment': { + "FOO": "1", + "BAR": "2", + }, + }, + ]) + class BuildPathTest(unittest.TestCase): def setUp(self): @@ -407,7 +422,10 @@ class BuildPathTest(unittest.TestCase): options = {'build': 'nonexistent.path'} self.assertRaises( config.ConfigurationError, - lambda: config.make_service_dict('foo', options, 'tests/fixtures/build-path'), + lambda: config.from_dictionary({ + 'foo': options, + 'working_dir': 'tests/fixtures/build-path' + }) ) def test_relative_path(self):