浏览代码

Disallow booleans in environment

When users were putting true/false/yes/no in the environment key,
the YML parser was converting them into True/False, rather than leaving
them as a string.

This change will force people to put them in quotes, thus ensuring
that the value gets passed through as intended.

Signed-off-by: Mazz Mosley <[email protected]>
Mazz Mosley 10 年之前
父节点
当前提交
a594a2ccc2
共有 3 个文件被更改,包括 17 次插入5 次删除
  1. 9 1
      compose/config/fields_schema.json
  2. 5 1
      docs/yml.md
  3. 3 3
      tests/unit/config_test.py

+ 9 - 1
compose/config/fields_schema.json

@@ -36,7 +36,15 @@
 
         "environment": {
           "oneOf": [
-            {"type": "object"},
+            {
+              "type": "object",
+              "patternProperties": {
+                "^[a-zA-Z0-9_]+$": {
+                  "type": ["string", "number"]
+                }
+              },
+              "additionalProperties": false
+            },
             {"type": "array", "items": {"type": "string"}, "uniqueItems": true}
           ]
         },

+ 5 - 1
docs/yml.md

@@ -184,17 +184,21 @@ Mount all of the volumes from another service or container.
 
 ### environment
 
-Add environment variables. You can use either an array or a dictionary.
+Add environment variables. You can use either an array or a dictionary. Any
+boolean values; true, false, yes no, need to be enclosed in quotes to ensure
+they are not converted to True or False by the YML parser.
 
 Environment variables with only a key are resolved to their values on the
 machine Compose is running on, which can be helpful for secret or host-specific values.
 
     environment:
       RACK_ENV: development
+      SHOW: 'true'
       SESSION_SECRET:
 
     environment:
       - RACK_ENV=development
+      - SHOW=true
       - SESSION_SECRET
 
 ### env_file

+ 3 - 3
tests/unit/config_test.py

@@ -270,15 +270,15 @@ class ConfigTest(unittest.TestCase):
             )
             self.assertEqual(service[0]['entrypoint'], entrypoint)
 
-    def test_validation_message_for_invalid_type_when_multiple_types_allowed(self):
-        expected_error_msg = "Service 'web' configuration key 'mem_limit' contains an invalid type, it should be a number or a string"
+    def test_config_environment_contains_boolean_validation_error(self):
+        expected_error_msg = "Service 'web' configuration key 'environment' contains an invalid type"
 
         with self.assertRaisesRegexp(ConfigurationError, expected_error_msg):
             config.load(
                 config.ConfigDetails(
                     {'web': {
                         'image': 'busybox',
-                        'mem_limit': ['incorrect']
+                        'environment': {'SHOW_STUFF': True}
                     }},
                     'working_dir',
                     'filename.yml'