瀏覽代碼

Add "network" field to build configuration

Signed-off-by: Joffrey F <[email protected]>
Joffrey F 8 年之前
父節點
當前提交
e33041582f

+ 1 - 0
compose/config/config.py

@@ -975,6 +975,7 @@ def merge_build(output, base, override):
     md = MergeDict(to_dict(base), to_dict(override))
     md.merge_scalar('context')
     md.merge_scalar('dockerfile')
+    md.merge_scalar('network')
     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.2.json

@@ -60,7 +60,8 @@
                 "dockerfile": {"type": "string"},
                 "args": {"$ref": "#/definitions/list_or_dict"},
                 "labels": {"$ref": "#/definitions/list_or_dict"},
-                "cache_from": {"$ref": "#/definitions/list_of_strings"}
+                "cache_from": {"$ref": "#/definitions/list_of_strings"},
+                "network": {"type": "string"}
               },
               "additionalProperties": false
             }

+ 2 - 1
compose/service.py

@@ -906,7 +906,8 @@ class Service(object):
             dockerfile=build_opts.get('dockerfile', None),
             cache_from=build_opts.get('cache_from', None),
             labels=build_opts.get('labels', None),
-            buildargs=build_args
+            buildargs=build_args,
+            network_mode=build_opts.get('network', None),
         )
 
         try:

+ 24 - 0
tests/integration/service_test.py

@@ -717,6 +717,30 @@ class ServiceTest(DockerClientTestCase):
         assert service.image()
         assert service.image()['Config']['Labels']['com.docker.compose.test'] == 'true'
 
+    def test_build_with_network(self):
+        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\n')
+            f.write('RUN ping -c1 google.local\n')
+
+        net_container = self.client.create_container(
+            'busybox', 'top', host_config=self.client.create_host_config(
+                extra_hosts={'google.local': '8.8.8.8'}
+            ), name='composetest_build_network'
+        )
+
+        self.addCleanup(self.client.remove_container, net_container, force=True)
+        self.client.start(net_container)
+
+        service = self.create_service('buildwithnet', build={
+            'context': text_type(base_dir),
+            'network': 'container:{}'.format(net_container['Id'])
+        })
+
+        service.build()
+        assert service.image()
+
     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

@@ -473,6 +473,7 @@ class ServiceTest(unittest.TestCase):
             buildargs={},
             labels=None,
             cache_from=None,
+            network_mode=None,
         )
 
     def test_ensure_image_exists_no_build(self):
@@ -511,6 +512,7 @@ class ServiceTest(unittest.TestCase):
             buildargs={},
             labels=None,
             cache_from=None,
+            network_mode=None,
         )
 
     def test_build_does_not_pull(self):