瀏覽代碼

Do not allow to specify both image and dockerfile in configuration. Closes #1908

Signed-off-by: Karol Duleba <[email protected]>
Karol Duleba 10 年之前
父節點
當前提交
477d4f491d
共有 4 個文件被更改,包括 26 次插入1 次删除
  1. 4 1
      compose/config/schema.json
  2. 5 0
      compose/config/validation.py
  3. 6 0
      docs/yml.md
  4. 11 0
      tests/unit/config_test.py

+ 4 - 1
compose/config/schema.json

@@ -113,7 +113,10 @@
         },
         {
           "required": ["image"],
-          "not": {"required": ["build"]}
+          "not": {"anyOf": [
+            {"required": ["build"]},
+            {"required": ["dockerfile"]}
+          ]}
         },
         {
           "required": ["extends"],

+ 5 - 0
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':

+ 6 - 0
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.

+ 11 - 0
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)