Prechádzať zdrojové kódy

Merge pull request #4086 from docker/bump-1.9.0-rc2

Bump 1.9.0 rc2
Joffrey F 9 rokov pred
rodič
commit
24e9f66d79

+ 1 - 1
compose/__init__.py

@@ -1,4 +1,4 @@
 from __future__ import absolute_import
 from __future__ import unicode_literals
 
-__version__ = '1.9.0-rc1'
+__version__ = '1.9.0-rc2'

+ 3 - 3
compose/cli/errors.py

@@ -4,6 +4,7 @@ from __future__ import unicode_literals
 import contextlib
 import logging
 import socket
+from distutils.spawn import find_executable
 from textwrap import dedent
 
 from docker.errors import APIError
@@ -13,7 +14,6 @@ from requests.exceptions import SSLError
 from requests.packages.urllib3.exceptions import ReadTimeoutError
 
 from ..const import API_VERSION_TO_ENGINE_VERSION
-from .utils import call_silently
 from .utils import is_docker_for_mac_installed
 from .utils import is_mac
 from .utils import is_ubuntu
@@ -90,11 +90,11 @@ def exit_with_error(msg):
 
 
 def get_conn_error_message(url):
-    if call_silently(['which', 'docker']) != 0:
+    if find_executable('docker') is None:
         return docker_not_found_msg("Couldn't connect to Docker daemon.")
     if is_docker_for_mac_installed():
         return conn_error_docker_for_mac
-    if call_silently(['which', 'docker-machine']) == 0:
+    if find_executable('docker-machine') is not None:
         return conn_error_docker_machine
     return conn_error_generic.format(url=url)
 

+ 3 - 3
compose/cli/main.py

@@ -10,6 +10,7 @@ import pipes
 import re
 import subprocess
 import sys
+from distutils.spawn import find_executable
 from inspect import getdoc
 from operator import attrgetter
 
@@ -1063,9 +1064,8 @@ def exit_if(condition, message, exit_code):
 
 
 def call_docker(args):
-    try:
-        executable_path = subprocess.check_output(["which", "docker"]).strip()
-    except subprocess.CalledProcessError:
+    executable_path = find_executable('docker')
+    if not executable_path:
         raise UserError(errors.docker_not_found_msg("Couldn't find `docker` binary."))
 
     args = [executable_path] + args

+ 10 - 0
compose/config/config_schema_v2.1.json

@@ -140,6 +140,7 @@
         "mac_address": {"type": "string"},
         "mem_limit": {"type": ["number", "string"]},
         "memswap_limit": {"type": ["number", "string"]},
+        "mem_swappiness": {"type": "integer"},
         "network_mode": {"type": "string"},
 
         "networks": {
@@ -168,6 +169,14 @@
             }
           ]
         },
+        "oom_score_adj": {"type": "integer", "minimum": -1000, "maximum": 1000},
+        "group_add": {
+            "type": "array",
+            "items": {
+                "type": ["string", "number"]
+            },
+            "uniqueItems": true
+        },
         "pid": {"type": ["string", "null"]},
 
         "ports": {
@@ -248,6 +257,7 @@
           },
           "additionalProperties": false
         },
+        "internal": {"type": "boolean"},
         "enable_ipv6": {"type": "boolean"},
         "labels": {"$ref": "#/definitions/list_or_dict"}
       },

+ 4 - 0
compose/project.py

@@ -538,6 +538,10 @@ def get_volumes_from(project, service_dict):
 def warn_for_swarm_mode(client):
     info = client.info()
     if info.get('Swarm', {}).get('LocalNodeState') == 'active':
+        if info.get('ServerVersion', '').startswith('ucp'):
+            # UCP does multi-node scheduling with traditional Compose files.
+            return
+
         log.warn(
             "The Docker Engine you're using is running in swarm mode.\n\n"
             "Compose does not use swarm mode to deploy services to multiple nodes in a swarm. "

+ 5 - 0
docker-compose.spec

@@ -27,6 +27,11 @@ exe = EXE(pyz,
                 'compose/config/config_schema_v2.0.json',
                 'DATA'
             ),
+            (
+                'compose/config/config_schema_v2.1.json',
+                'compose/config/config_schema_v2.1.json',
+                'DATA'
+            ),
             (
                 'compose/GITSHA',
                 'compose/GITSHA',

+ 1 - 1
requirements.txt

@@ -1,7 +1,7 @@
 PyYAML==3.11
 backports.ssl-match-hostname==3.5.0.1; python_version < '3'
 cached-property==1.2.0
-docker-py==1.10.4
+docker-py==1.10.5
 dockerpty==0.4.1
 docopt==0.6.1
 enum34==1.0.4; python_version < '3.4'

+ 1 - 1
script/run/run.sh

@@ -15,7 +15,7 @@
 
 set -e
 
-VERSION="1.9.0-rc1"
+VERSION="1.9.0-rc2"
 IMAGE="docker/compose:$VERSION"
 
 

+ 1 - 1
setup.py

@@ -34,7 +34,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-py >= 1.10.4, < 2.0',
+    'docker-py >= 1.10.5, < 2.0',
     'dockerpty >= 0.4.1, < 0.5',
     'six >= 1.3.0, < 2',
     'jsonschema >= 2.5.1, < 3',

+ 4 - 4
tests/integration/project_test.py

@@ -826,9 +826,9 @@ class ProjectTest(DockerClientTestCase):
             name='composetest',
             config_data=config_data
         )
-        project.up()
+        project.up(detached=True)
 
-        service_container = project.get_service('web').containers()[0]
+        service_container = project.get_service('web').containers(stopped=True)[0]
         ipam_config = service_container.inspect().get(
             'NetworkSettings', {}
         ).get(
@@ -857,8 +857,8 @@ class ProjectTest(DockerClientTestCase):
             name='composetest',
             config_data=config_data
         )
-        project.up()
-        service_container = project.get_service('web').containers()[0]
+        project.up(detached=True)
+        service_container = project.get_service('web').containers(stopped=True)[0]
         assert service_container.inspect()['HostConfig']['Isolation'] == 'default'
 
     @v2_1_only()

+ 3 - 3
tests/unit/cli/errors_test.py

@@ -16,9 +16,9 @@ def mock_logging():
         yield mock_log
 
 
-def patch_call_silently(side_effect):
+def patch_find_executable(side_effect):
     return mock.patch(
-        'compose.cli.errors.call_silently',
+        'compose.cli.errors.find_executable',
         autospec=True,
         side_effect=side_effect)
 
@@ -27,7 +27,7 @@ class TestHandleConnectionErrors(object):
 
     def test_generic_connection_error(self, mock_logging):
         with pytest.raises(errors.ConnectionError):
-            with patch_call_silently([0, 1]):
+            with patch_find_executable(['/bin/docker', None]):
                 with handle_connection_errors(mock.Mock()):
                     raise ConnectionError()