mirror of https://github.com/docker/compose.git
Merge pull request #2938 from shin-/2927-buildargs-types
Constraint build argument types. Numbers are cast into strings.
This commit is contained in:
commit
d3a95c2892
|
@ -16,6 +16,7 @@ from cached_property import cached_property
|
|||
|
||||
from ..const import COMPOSEFILE_V1 as V1
|
||||
from ..const import COMPOSEFILE_V2_0 as V2_0
|
||||
from ..utils import build_string_dict
|
||||
from .errors import CircularReference
|
||||
from .errors import ComposeFileNotFound
|
||||
from .errors import ConfigurationError
|
||||
|
@ -292,8 +293,12 @@ def load(config_details):
|
|||
config_details = config_details._replace(config_files=processed_files)
|
||||
|
||||
main_file = config_details.config_files[0]
|
||||
volumes = load_mapping(config_details.config_files, 'get_volumes', 'Volume')
|
||||
networks = load_mapping(config_details.config_files, 'get_networks', 'Network')
|
||||
volumes = load_mapping(
|
||||
config_details.config_files, 'get_volumes', 'Volume'
|
||||
)
|
||||
networks = load_mapping(
|
||||
config_details.config_files, 'get_networks', 'Network'
|
||||
)
|
||||
service_dicts = load_services(
|
||||
config_details.working_dir,
|
||||
main_file,
|
||||
|
@ -333,6 +338,11 @@ def load_mapping(config_files, get_func, entity_type):
|
|||
|
||||
mapping[name] = config
|
||||
|
||||
if 'driver_opts' in config:
|
||||
config['driver_opts'] = build_string_dict(
|
||||
config['driver_opts']
|
||||
)
|
||||
|
||||
return mapping
|
||||
|
||||
|
||||
|
@ -851,7 +861,7 @@ def normalize_build(service_dict, working_dir):
|
|||
else:
|
||||
build.update(service_dict['build'])
|
||||
if 'args' in build:
|
||||
build['args'] = resolve_build_args(build)
|
||||
build['args'] = build_string_dict(resolve_build_args(build))
|
||||
|
||||
service_dict['build'] = build
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@
|
|||
"driver_opts": {
|
||||
"type": "object",
|
||||
"patternProperties": {
|
||||
"^.+$": {"type": "string"}
|
||||
"^.+$": {"type": ["string", "number"]}
|
||||
}
|
||||
},
|
||||
"external": {
|
||||
|
|
|
@ -23,7 +23,20 @@
|
|||
"properties": {
|
||||
"context": {"type": "string"},
|
||||
"dockerfile": {"type": "string"},
|
||||
"args": {"$ref": "#/definitions/list_or_dict"}
|
||||
"args": {
|
||||
"oneOf": [
|
||||
{"$ref": "#/definitions/list_of_strings"},
|
||||
{
|
||||
"type": "object",
|
||||
"patternProperties": {
|
||||
"^.+$": {
|
||||
"type": ["string", "number"]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
|
|
|
@ -92,3 +92,7 @@ def json_hash(obj):
|
|||
|
||||
def microseconds_from_time_nano(time_nano):
|
||||
return int(time_nano % 1000000000 / 1000)
|
||||
|
||||
|
||||
def build_string_dict(source_dict):
|
||||
return dict((k, str(v)) for k, v in source_dict.items())
|
||||
|
|
|
@ -231,7 +231,7 @@ class ConfigTest(unittest.TestCase):
|
|||
assert volumes['simple'] == {}
|
||||
assert volumes['other'] == {}
|
||||
|
||||
def test_volume_invalid_driver_opt(self):
|
||||
def test_volume_numeric_driver_opt(self):
|
||||
config_details = build_config_details({
|
||||
'version': '2',
|
||||
'services': {
|
||||
|
@ -241,6 +241,19 @@ class ConfigTest(unittest.TestCase):
|
|||
'simple': {'driver_opts': {'size': 42}},
|
||||
}
|
||||
})
|
||||
cfg = config.load(config_details)
|
||||
assert cfg.volumes['simple']['driver_opts']['size'] == '42'
|
||||
|
||||
def test_volume_invalid_driver_opt(self):
|
||||
config_details = build_config_details({
|
||||
'version': '2',
|
||||
'services': {
|
||||
'simple': {'image': 'busybox'}
|
||||
},
|
||||
'volumes': {
|
||||
'simple': {'driver_opts': {'size': True}},
|
||||
}
|
||||
})
|
||||
with pytest.raises(ConfigurationError) as exc:
|
||||
config.load(config_details)
|
||||
assert 'driver_opts.size contains an invalid type' in exc.exconly()
|
||||
|
@ -608,6 +621,34 @@ class ConfigTest(unittest.TestCase):
|
|||
self.assertTrue('context' in service[0]['build'])
|
||||
self.assertEqual(service[0]['build']['dockerfile'], 'Dockerfile-alt')
|
||||
|
||||
def test_load_with_buildargs(self):
|
||||
service = config.load(
|
||||
build_config_details(
|
||||
{
|
||||
'version': '2',
|
||||
'services': {
|
||||
'web': {
|
||||
'build': {
|
||||
'context': '.',
|
||||
'dockerfile': 'Dockerfile-alt',
|
||||
'args': {
|
||||
'opt1': 42,
|
||||
'opt2': 'foobar'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
'tests/fixtures/extends',
|
||||
'filename.yml'
|
||||
)
|
||||
).services[0]
|
||||
assert 'args' in service['build']
|
||||
assert 'opt1' in service['build']['args']
|
||||
assert isinstance(service['build']['args']['opt1'], str)
|
||||
assert service['build']['args']['opt1'] == '42'
|
||||
assert service['build']['args']['opt2'] == 'foobar'
|
||||
|
||||
def test_load_with_multiple_files_v2(self):
|
||||
base_file = config.ConfigFile(
|
||||
'base.yaml',
|
||||
|
|
Loading…
Reference in New Issue