From 1ecf51c2098c02507ad3382b13fef4cdd494cc56 Mon Sep 17 00:00:00 2001 From: Yong Wen Chua Date: Mon, 10 Jul 2017 13:02:47 +0800 Subject: [PATCH] Add `target` to service build configuration Signed-off-by: Yong Wen Chua --- compose/config/config.py | 1 + compose/config/config_schema_v2.3.json | 3 ++- compose/service.py | 1 + tests/integration/service_test.py | 22 ++++++++++++++++++++++ tests/unit/service_test.py | 2 ++ 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/compose/config/config.py b/compose/config/config.py index f5053af8a..659b6cd59 100644 --- a/compose/config/config.py +++ b/compose/config/config.py @@ -986,6 +986,7 @@ def merge_build(output, base, override): md.merge_scalar('context') md.merge_scalar('dockerfile') md.merge_scalar('network') + md.merge_scalar('target') md.merge_mapping('args', parse_build_arguments) md.merge_field('cache_from', merge_unique_items_lists, default=[]) md.merge_mapping('labels', parse_labels) diff --git a/compose/config/config_schema_v2.3.json b/compose/config/config_schema_v2.3.json index abcc2ded2..877340276 100644 --- a/compose/config/config_schema_v2.3.json +++ b/compose/config/config_schema_v2.3.json @@ -61,7 +61,8 @@ "args": {"$ref": "#/definitions/list_or_dict"}, "labels": {"$ref": "#/definitions/list_or_dict"}, "cache_from": {"$ref": "#/definitions/list_of_strings"}, - "network": {"type": "string"} + "network": {"type": "string"}, + "target": {"type": "string"} }, "additionalProperties": false } diff --git a/compose/service.py b/compose/service.py index 53ad46362..4a55951a4 100644 --- a/compose/service.py +++ b/compose/service.py @@ -908,6 +908,7 @@ class Service(object): labels=build_opts.get('labels', None), buildargs=build_args, network_mode=build_opts.get('network', None), + target=build_opts.get('target', None), ) try: diff --git a/tests/integration/service_test.py b/tests/integration/service_test.py index ff75015df..4a5ec5654 100644 --- a/tests/integration/service_test.py +++ b/tests/integration/service_test.py @@ -40,6 +40,7 @@ from tests.integration.testcases import is_cluster from tests.integration.testcases import no_cluster from tests.integration.testcases import v2_1_only from tests.integration.testcases import v2_2_only +from tests.integration.testcases import v2_3_only from tests.integration.testcases import v2_only from tests.integration.testcases import v3_only @@ -754,6 +755,27 @@ class ServiceTest(DockerClientTestCase): assert service.image() + @v2_3_only() + def test_build_with_target(self): + self.require_api_version('1.30') + base_dir = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, base_dir) + + with open(os.path.join(base_dir, 'Dockerfile'), 'w') as f: + f.write('FROM busybox as one\n') + f.write('LABEL com.docker.compose.test.target=one\n') + f.write('FROM busybox as two\n') + f.write('LABEL com.docker.compose.test.target=two\n') + + service = self.create_service('buildlabels', build={ + 'context': text_type(base_dir), + 'target': 'one' + }) + + service.build() + assert service.image() + assert service.image()['Config']['Labels']['com.docker.compose.test.target'] == 'one' + def test_start_container_stays_unprivileged(self): service = self.create_service('web') container = create_and_start_container(service).inspect() diff --git a/tests/unit/service_test.py b/tests/unit/service_test.py index 2b0a2762d..0293695ab 100644 --- a/tests/unit/service_test.py +++ b/tests/unit/service_test.py @@ -474,6 +474,7 @@ class ServiceTest(unittest.TestCase): labels=None, cache_from=None, network_mode=None, + target=None, ) def test_ensure_image_exists_no_build(self): @@ -513,6 +514,7 @@ class ServiceTest(unittest.TestCase): labels=None, cache_from=None, network_mode=None, + target=None, ) def test_build_does_not_pull(self):