Browse Source

Add `target` to service build configuration

Signed-off-by: Yong Wen Chua <[email protected]>
Yong Wen Chua 8 years ago
parent
commit
16f8953c78

+ 1 - 0
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)

+ 2 - 1
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
             }

+ 4 - 1
compose/service.py

@@ -905,7 +905,10 @@ class Service(object):
             nocache=no_cache,
             dockerfile=build_opts.get('dockerfile', None),
             cache_from=build_opts.get('cache_from', None),
-            buildargs=build_args
+            labels=build_opts.get('labels', None),
+            buildargs=build_args,
+            network_mode=build_opts.get('network', None),
+            target=build_opts.get('target', None),
         )
 
         try:

+ 22 - 0
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()

+ 2 - 0
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):