From 477d4f491dca36f9c717f8bb6366d1f756a387bc Mon Sep 17 00:00:00 2001 From: Karol Duleba Date: Wed, 26 Aug 2015 22:03:45 +0100 Subject: [PATCH] Do not allow to specify both image and dockerfile in configuration. Closes #1908 Signed-off-by: Karol Duleba --- compose/config/schema.json | 5 ++++- compose/config/validation.py | 5 +++++ docs/yml.md | 6 ++++++ tests/unit/config_test.py | 11 +++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/compose/config/schema.json b/compose/config/schema.json index 8e9b79fb6..94fe4fc52 100644 --- a/compose/config/schema.json +++ b/compose/config/schema.json @@ -113,7 +113,10 @@ }, { "required": ["image"], - "not": {"required": ["build"]} + "not": {"anyOf": [ + {"required": ["build"]}, + {"required": ["dockerfile"]} + ]} }, { "required": ["extends"], diff --git a/compose/config/validation.py b/compose/config/validation.py index 0df73e3c2..d83504274 100644 --- a/compose/config/validation.py +++ b/compose/config/validation.py @@ -134,6 +134,11 @@ def process_errors(errors): required.append( "Service '{}' has neither an image nor a build path " "specified. Exactly one must be provided.".format(service_name)) + elif 'image' in error.instance and 'dockerfile' in error.instance: + required.append( + "Service '{}' has both an image and alternate Dockerfile. " + "A service can either be built to image or use an existing " + "image, not both.".format(service_name)) else: required.append(_clean_error_message(error.message)) elif error.validator == 'oneOf': diff --git a/docs/yml.md b/docs/yml.md index 6fb31a7db..3ece02649 100644 --- a/docs/yml.md +++ b/docs/yml.md @@ -33,6 +33,8 @@ pull if it doesn't exist locally. image: a4bc65fd image: busybox@sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d +Using `image` together with either `build` or `dockerfile` is not allowed. Attempting to do so results in an error. + ### build Path to a directory containing a Dockerfile. When the value supplied is a @@ -43,6 +45,8 @@ Compose will build and tag it with a generated name, and use that image thereaft build: /path/to/build/dir +Using `build` together with `image` is not allowed. Attempting to do so results in an error. + ### dockerfile Alternate Dockerfile. @@ -51,6 +55,8 @@ Compose will use an alternate file to build with. dockerfile: Dockerfile-alternate +Using `dockerfile` together with `image` is not allowed. Attempting to do so results in an error. + ### command Override the default command. diff --git a/tests/unit/config_test.py b/tests/unit/config_test.py index 51dac052f..e488ceb52 100644 --- a/tests/unit/config_test.py +++ b/tests/unit/config_test.py @@ -191,6 +191,17 @@ class ConfigTest(unittest.TestCase): ) ) + def test_config_image_and_dockerfile_raise_validation_error(self): + expected_error_msg = "Service 'web' has both an image and alternate Dockerfile." + with self.assertRaisesRegexp(ConfigurationError, expected_error_msg): + config.load( + config.ConfigDetails( + {'web': {'image': 'busybox', 'dockerfile': 'Dockerfile.alt'}}, + 'working_dir', + 'filename.yml' + ) + ) + class InterpolationTest(unittest.TestCase): @mock.patch.dict(os.environ)