浏览代码

Fix #3281: Unexpected result when using build args with default values

Fix the issue when build arg is set to None instead of empty string. Usecase:

cat docker-compose.yml
  .... args:
  - http_proxy
  - https_proxy
  - no_proxy

If http_proxy, https_proxy, no_proxy environment variables are not defined then http_proxy,
https_proxy, no_proxy build args will be set to string None which breaks all downloads

With this change undefined build args will be set to empty string instead of string None

Signed-off-by: Andrey Devyatkin <[email protected]>
Andrey Devyatkin 9 年之前
父节点
当前提交
a67ba5536d
共有 2 个文件被更改,包括 29 次插入1 次删除
  1. 1 1
      compose/utils.py
  2. 28 0
      tests/unit/config/config_test.py

+ 1 - 1
compose/utils.py

@@ -95,4 +95,4 @@ def microseconds_from_time_nano(time_nano):
 
 
 def build_string_dict(source_dict):
-    return dict((k, str(v if v else '')) for k, v in source_dict.items())
+    return dict((k, str(v if v is not None else '')) for k, v in source_dict.items())

+ 28 - 0
tests/unit/config/config_test.py

@@ -717,6 +717,34 @@ class ConfigTest(unittest.TestCase):
         assert 'foo' in service['build']['args']
         assert service['build']['args']['foo'] == ''
 
+    # If build argument is None then it will be converted to the empty
+    # string. Make sure that int zero kept as it is, i.e. not converted to
+    # the empty string
+    def test_build_args_check_zero_preserved(self):
+        service = config.load(
+            build_config_details(
+                {
+                    'version': '2',
+                    'services': {
+                        'web': {
+                            'build': {
+                                'context': '.',
+                                'dockerfile': 'Dockerfile-alt',
+                                'args': {
+                                    'foo': 0
+                                }
+                            }
+                        }
+                    }
+                },
+                'tests/fixtures/extends',
+                'filename.yml'
+            )
+        ).services[0]
+        assert 'args' in service['build']
+        assert 'foo' in service['build']['args']
+        assert service['build']['args']['foo'] == '0'
+
     def test_load_with_multiple_files_mismatched_networks_format(self):
         base_file = config.ConfigFile(
             'base.yaml',