mirror of https://github.com/docker/compose.git
Merge pull request #2997 from dnephin/fix_env_var_without_value
Fix env var without value
This commit is contained in:
commit
f2ccbeff76
|
@ -512,12 +512,12 @@ def resolve_environment(service_dict):
|
||||||
env.update(env_vars_from_file(env_file))
|
env.update(env_vars_from_file(env_file))
|
||||||
|
|
||||||
env.update(parse_environment(service_dict.get('environment')))
|
env.update(parse_environment(service_dict.get('environment')))
|
||||||
return dict(filter(None, (resolve_env_var(k, v) for k, v in six.iteritems(env))))
|
return dict(resolve_env_var(k, v) for k, v in six.iteritems(env))
|
||||||
|
|
||||||
|
|
||||||
def resolve_build_args(build):
|
def resolve_build_args(build):
|
||||||
args = parse_build_arguments(build.get('args'))
|
args = parse_build_arguments(build.get('args'))
|
||||||
return dict(filter(None, (resolve_env_var(k, v) for k, v in six.iteritems(args))))
|
return dict(resolve_env_var(k, v) for k, v in six.iteritems(args))
|
||||||
|
|
||||||
|
|
||||||
def validate_extended_service_dict(service_dict, filename, service):
|
def validate_extended_service_dict(service_dict, filename, service):
|
||||||
|
@ -827,7 +827,7 @@ def resolve_env_var(key, val):
|
||||||
elif key in os.environ:
|
elif key in os.environ:
|
||||||
return key, os.environ[key]
|
return key, os.environ[key]
|
||||||
else:
|
else:
|
||||||
return ()
|
return key, None
|
||||||
|
|
||||||
|
|
||||||
def env_vars_from_file(filename):
|
def env_vars_from_file(filename):
|
||||||
|
|
|
@ -134,7 +134,11 @@ class Container(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def environment(self):
|
def environment(self):
|
||||||
return dict(var.split("=", 1) for var in self.get('Config.Env') or [])
|
def parse_env(var):
|
||||||
|
if '=' in var:
|
||||||
|
return var.split("=", 1)
|
||||||
|
return var, None
|
||||||
|
return dict(parse_env(var) for var in self.get('Config.Env') or [])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def exit_code(self):
|
def exit_code(self):
|
||||||
|
|
|
@ -622,6 +622,8 @@ class Service(object):
|
||||||
override_options,
|
override_options,
|
||||||
one_off=one_off)
|
one_off=one_off)
|
||||||
|
|
||||||
|
container_options['environment'] = format_environment(
|
||||||
|
container_options['environment'])
|
||||||
return container_options
|
return container_options
|
||||||
|
|
||||||
def _get_container_host_config(self, override_options, one_off=False):
|
def _get_container_host_config(self, override_options, one_off=False):
|
||||||
|
@ -1020,3 +1022,12 @@ def get_log_config(logging_dict):
|
||||||
type=log_driver,
|
type=log_driver,
|
||||||
config=log_options
|
config=log_options
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: remove once fix is available in docker-py
|
||||||
|
def format_environment(environment):
|
||||||
|
def format_env(key, value):
|
||||||
|
if value is None:
|
||||||
|
return key
|
||||||
|
return '{key}={value}'.format(key=key, value=value)
|
||||||
|
return [format_env(*item) for item in environment.items()]
|
||||||
|
|
|
@ -916,6 +916,7 @@ class ServiceTest(DockerClientTestCase):
|
||||||
'FILE_DEF': 'F1',
|
'FILE_DEF': 'F1',
|
||||||
'FILE_DEF_EMPTY': '',
|
'FILE_DEF_EMPTY': '',
|
||||||
'ENV_DEF': 'E3',
|
'ENV_DEF': 'E3',
|
||||||
|
'NO_DEF': None
|
||||||
}.items():
|
}.items():
|
||||||
self.assertEqual(env[k], v)
|
self.assertEqual(env[k], v)
|
||||||
|
|
||||||
|
|
|
@ -138,9 +138,10 @@ class CLITestCase(unittest.TestCase):
|
||||||
})
|
})
|
||||||
|
|
||||||
_, _, call_kwargs = mock_client.create_container.mock_calls[0]
|
_, _, call_kwargs = mock_client.create_container.mock_calls[0]
|
||||||
self.assertEqual(
|
assert (
|
||||||
call_kwargs['environment'],
|
sorted(call_kwargs['environment']) ==
|
||||||
{'FOO': 'ONE', 'BAR': 'NEW', 'OTHER': u'bär'})
|
sorted(['FOO=ONE', 'BAR=NEW', 'OTHER=bär'])
|
||||||
|
)
|
||||||
|
|
||||||
def test_run_service_with_restart_always(self):
|
def test_run_service_with_restart_always(self):
|
||||||
command = TopLevelCommand()
|
command = TopLevelCommand()
|
||||||
|
|
|
@ -1975,7 +1975,7 @@ class EnvTest(unittest.TestCase):
|
||||||
}
|
}
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
resolve_environment(service_dict),
|
resolve_environment(service_dict),
|
||||||
{'FILE_DEF': 'F1', 'FILE_DEF_EMPTY': '', 'ENV_DEF': 'E3'},
|
{'FILE_DEF': 'F1', 'FILE_DEF_EMPTY': '', 'ENV_DEF': 'E3', 'NO_DEF': None},
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_resolve_environment_from_env_file(self):
|
def test_resolve_environment_from_env_file(self):
|
||||||
|
@ -2016,6 +2016,7 @@ class EnvTest(unittest.TestCase):
|
||||||
'FILE_DEF': u'bär',
|
'FILE_DEF': u'bär',
|
||||||
'FILE_DEF_EMPTY': '',
|
'FILE_DEF_EMPTY': '',
|
||||||
'ENV_DEF': 'E3',
|
'ENV_DEF': 'E3',
|
||||||
|
'NO_DEF': None
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -2034,7 +2035,7 @@ class EnvTest(unittest.TestCase):
|
||||||
}
|
}
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
resolve_build_args(build),
|
resolve_build_args(build),
|
||||||
{'arg1': 'value1', 'empty_arg': '', 'env_arg': 'value2'},
|
{'arg1': 'value1', 'empty_arg': '', 'env_arg': 'value2', 'no_env': None},
|
||||||
)
|
)
|
||||||
|
|
||||||
@pytest.mark.xfail(IS_WINDOWS_PLATFORM, reason='paths use slash')
|
@pytest.mark.xfail(IS_WINDOWS_PLATFORM, reason='paths use slash')
|
||||||
|
|
|
@ -267,7 +267,7 @@ class ServiceTest(unittest.TestCase):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
opts['labels'][LABEL_CONFIG_HASH],
|
opts['labels'][LABEL_CONFIG_HASH],
|
||||||
'f8bfa1058ad1f4231372a0b1639f0dfdb574dafff4e8d7938049ae993f7cf1fc')
|
'f8bfa1058ad1f4231372a0b1639f0dfdb574dafff4e8d7938049ae993f7cf1fc')
|
||||||
assert opts['environment'] == {'also': 'real'}
|
assert opts['environment'] == ['also=real']
|
||||||
|
|
||||||
def test_get_container_create_options_sets_affinity_with_binds(self):
|
def test_get_container_create_options_sets_affinity_with_binds(self):
|
||||||
service = Service(
|
service = Service(
|
||||||
|
@ -298,7 +298,7 @@ class ServiceTest(unittest.TestCase):
|
||||||
1,
|
1,
|
||||||
previous_container=prev_container)
|
previous_container=prev_container)
|
||||||
|
|
||||||
assert opts['environment'] == {'affinity:container': '=ababab'}
|
assert opts['environment'] == ['affinity:container==ababab']
|
||||||
|
|
||||||
def test_get_container_create_options_no_affinity_without_binds(self):
|
def test_get_container_create_options_no_affinity_without_binds(self):
|
||||||
service = Service('foo', image='foo', client=self.mock_client)
|
service = Service('foo', image='foo', client=self.mock_client)
|
||||||
|
@ -312,7 +312,7 @@ class ServiceTest(unittest.TestCase):
|
||||||
{},
|
{},
|
||||||
1,
|
1,
|
||||||
previous_container=prev_container)
|
previous_container=prev_container)
|
||||||
assert opts['environment'] == {}
|
assert opts['environment'] == []
|
||||||
|
|
||||||
def test_get_container_not_found(self):
|
def test_get_container_not_found(self):
|
||||||
self.mock_client.containers.return_value = []
|
self.mock_client.containers.return_value = []
|
||||||
|
|
Loading…
Reference in New Issue