From 4f366d83556f23a34f5a1a59cc45fb7eada3c5c2 Mon Sep 17 00:00:00 2001 From: Aanand Prasad <aanand.prasad@gmail.com> Date: Thu, 30 Apr 2015 11:57:46 +0100 Subject: [PATCH] Make sure the build path we pass to docker-py is a binary string Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com> --- compose/service.py | 4 +++- tests/integration/service_test.py | 27 +++++++++++++++++++++++++++ tests/integration/testcases.py | 3 ++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/compose/service.py b/compose/service.py index b81922dd1..c66344833 100644 --- a/compose/service.py +++ b/compose/service.py @@ -462,8 +462,10 @@ class Service(object): def build(self, no_cache=False): log.info('Building %s...' % self.name) + path = six.binary_type(self.options['build']) + build_output = self.client.build( - self.options['build'], + path=path, tag=self.full_name, stream=True, rm=True, diff --git a/tests/integration/service_test.py b/tests/integration/service_test.py index 6e63bf365..8b2a1b1a7 100644 --- a/tests/integration/service_test.py +++ b/tests/integration/service_test.py @@ -4,6 +4,10 @@ import os from os import path import mock +import tempfile +import shutil +import six + from compose import Service from compose.service import ( CannotBeScaledError, @@ -404,6 +408,29 @@ class ServiceTest(DockerClientTestCase): self.assertEqual(list(container['NetworkSettings']['Ports'].keys()), ['8000/tcp']) self.assertNotEqual(container['NetworkSettings']['Ports']['8000/tcp'][0]['HostPort'], '8000') + def test_build(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") + + self.create_service('web', build=base_dir).build() + self.assertEqual(len(self.client.images(name='composetest_web')), 1) + + def test_build_non_ascii_filename(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") + + with open(os.path.join(base_dir, b'foo\xE2bar'), 'w') as f: + f.write("hello world\n") + + self.create_service('web', build=six.text_type(base_dir)).build() + self.assertEqual(len(self.client.images(name='composetest_web')), 1) + def test_start_container_stays_unpriviliged(self): service = self.create_service('web') container = create_and_start_container(service).inspect() diff --git a/tests/integration/testcases.py b/tests/integration/testcases.py index 715b135c4..31281a1d7 100644 --- a/tests/integration/testcases.py +++ b/tests/integration/testcases.py @@ -22,7 +22,8 @@ class DockerClientTestCase(unittest.TestCase): self.client.remove_image(i) def create_service(self, name, **kwargs): - kwargs['image'] = kwargs.pop('image', 'busybox:latest') + if 'image' not in kwargs and 'build' not in kwargs: + kwargs['image'] = 'busybox:latest' if 'command' not in kwargs: kwargs['command'] = ["/bin/sleep", "300"]