Add `target` to service build configuration

Signed-off-by: Yong Wen Chua <me@yongwen.xyz>
This commit is contained in:
Yong Wen Chua 2017-07-10 13:02:47 +08:00 committed by Joffrey F
parent 4a65008199
commit 1ecf51c209
5 changed files with 28 additions and 1 deletions

View File

@ -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)

View File

@ -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
}

View File

@ -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:

View File

@ -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()

View File

@ -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):