diff --git a/README.md b/README.md index 35a10b90..d43bd8c4 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Installation and documentation Contributing ------------ -[![Build Status](http://jenkins.dockerproject.org/buildStatus/icon?job=Compose%20Master)](http://jenkins.dockerproject.org/job/Compose%20Master/) +[![Build Status](https://jenkins.dockerproject.org/buildStatus/icon?job=docker/compose/master)](https://jenkins.dockerproject.org/job/docker/job/compose/job/master/) Want to help build Compose? Check out our [contributing documentation](https://github.com/docker/compose/blob/master/CONTRIBUTING.md). diff --git a/compose/config/config_schema_v3.1.json b/compose/config/config_schema_v3.1.json index b7037485..77c2d35c 100644 --- a/compose/config/config_schema_v3.1.json +++ b/compose/config/config_schema_v3.1.json @@ -71,7 +71,8 @@ "properties": { "context": {"type": "string"}, "dockerfile": {"type": "string"}, - "args": {"$ref": "#/definitions/list_or_dict"} + "args": {"$ref": "#/definitions/list_or_dict"}, + "cache_from": {"type": "#/definitions/list_of_strings"} }, "additionalProperties": false } diff --git a/compose/service.py b/compose/service.py index 9f2fc68b..023efa27 100644 --- a/compose/service.py +++ b/compose/service.py @@ -802,6 +802,7 @@ class Service(object): nocache=no_cache, dockerfile=build_opts.get('dockerfile', None), buildargs=build_opts.get('args', None), + cache_from=build_opts.get('cache_from', None), ) try: diff --git a/contrib/completion/bash/docker-compose b/contrib/completion/bash/docker-compose index 77d02b42..3cf37a70 100644 --- a/contrib/completion/bash/docker-compose +++ b/contrib/completion/bash/docker-compose @@ -18,7 +18,7 @@ __docker_compose_q() { - docker-compose 2>/dev/null $daemon_options "$@" + docker-compose 2>/dev/null "${daemon_options[@]}" "$@" } # Transforms a multiline list of strings into a single line string diff --git a/requirements.txt b/requirements.txt index 3b06bff4..53b9294c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ PyYAML==3.11 backports.ssl-match-hostname==3.5.0.1; python_version < '3' cached-property==1.2.0 colorama==0.3.7 -docker==2.0.2 +docker==2.1.0 dockerpty==0.4.1 docopt==0.6.1 enum34==1.0.4; python_version < '3.4' diff --git a/script/test/versions.py b/script/test/versions.py index 0c3b8162..97383ad9 100755 --- a/script/test/versions.py +++ b/script/test/versions.py @@ -44,7 +44,7 @@ class Version(namedtuple('_Version', 'major minor patch rc')): version = version.lstrip('v') version, _, rc = version.partition('-') major, minor, patch = version.split('.', 3) - return cls(int(major), int(minor), int(patch), rc) + return cls(major, minor, patch, rc) @property def major_minor(self): @@ -57,7 +57,7 @@ class Version(namedtuple('_Version', 'major minor patch rc')): """ # rc releases should appear before official releases rc = (0, self.rc) if self.rc else (1, ) - return (self.major, self.minor, self.patch) + rc + return (int(self.major), int(self.minor), int(self.patch)) + rc def __str__(self): rc = '-{}'.format(self.rc) if self.rc else '' diff --git a/setup.py b/setup.py index eafbc356..13fe59b2 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ install_requires = [ 'requests >= 2.6.1, != 2.11.0, < 2.12', 'texttable >= 0.8.1, < 0.9', 'websocket-client >= 0.32.0, < 1.0', - 'docker >= 2.0.2, < 3.0', + 'docker >= 2.1.0, < 3.0', 'dockerpty >= 0.4.1, < 0.5', 'six >= 1.3.0, < 2', 'jsonschema >= 2.5.1, < 3', diff --git a/tests/integration/service_test.py b/tests/integration/service_test.py index 09758eee..cb6e5d31 100644 --- a/tests/integration/service_test.py +++ b/tests/integration/service_test.py @@ -32,6 +32,7 @@ from compose.service import NetworkMode from compose.service import Service from tests.integration.testcases import v2_1_only from tests.integration.testcases import v2_only +from tests.integration.testcases import v3_only def create_and_start_container(service, **override_options): @@ -946,6 +947,20 @@ class ServiceTest(DockerClientTestCase): }.items(): self.assertEqual(env[k], v) + @v3_only() + def test_build_with_cachefrom(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") + + service = self.create_service('cache_from', + build={'context': base_dir, + 'cache_from': ['build1']}) + service.build() + assert service.image() + @mock.patch.dict(os.environ) def test_resolve_env(self): os.environ['FILE_DEF'] = 'E1' diff --git a/tests/unit/service_test.py b/tests/unit/service_test.py index 2d5b1761..0a66e4f3 100644 --- a/tests/unit/service_test.py +++ b/tests/unit/service_test.py @@ -446,6 +446,7 @@ class ServiceTest(unittest.TestCase): nocache=False, rm=True, buildargs=None, + cache_from=None, ) def test_ensure_image_exists_no_build(self): @@ -482,6 +483,7 @@ class ServiceTest(unittest.TestCase): nocache=False, rm=True, buildargs=None, + cache_from=None, ) def test_build_does_not_pull(self):