mirror of
https://github.com/docker/compose.git
synced 2025-07-21 04:34:38 +02:00
commit
0f8a1aa7a3
12
CHANGELOG.md
12
CHANGELOG.md
@ -12,8 +12,6 @@ Change log
|
|||||||
version requires to be used with Docker Engine 1.13 or above and is
|
version requires to be used with Docker Engine 1.13 or above and is
|
||||||
specifically designed to work with the `docker stack` commands.
|
specifically designed to work with the `docker stack` commands.
|
||||||
|
|
||||||
- Added support for the `stop_grace_period` option in service definitions.
|
|
||||||
|
|
||||||
#### Compose file version 2.1 and up
|
#### Compose file version 2.1 and up
|
||||||
|
|
||||||
- Healthcheck configuration can now be done in the service definition using
|
- Healthcheck configuration can now be done in the service definition using
|
||||||
@ -30,6 +28,10 @@ Change log
|
|||||||
|
|
||||||
- Compose now adds identifying labels to networks and volumes it creates
|
- Compose now adds identifying labels to networks and volumes it creates
|
||||||
|
|
||||||
|
#### Compose file version 2.0 and up
|
||||||
|
|
||||||
|
- Added support for the `stop_grace_period` option in service definitions.
|
||||||
|
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
|
|
||||||
- Colored output now works properly on Windows.
|
- Colored output now works properly on Windows.
|
||||||
@ -40,6 +42,12 @@ Change log
|
|||||||
- Networks created by Compose are now always made attachable
|
- Networks created by Compose are now always made attachable
|
||||||
(Compose files v2.1 and up).
|
(Compose files v2.1 and up).
|
||||||
|
|
||||||
|
- Fixed a bug where falsy values of `COMPOSE_CONVERT_WINDOWS_PATHS`
|
||||||
|
(`0`, `false`, empty value) were being interpreted as true.
|
||||||
|
|
||||||
|
- Fixed a bug where forward slashes in some .dockerignore patterns weren't
|
||||||
|
being parsed correctly on Windows
|
||||||
|
|
||||||
|
|
||||||
1.9.0 (2016-11-16)
|
1.9.0 (2016-11-16)
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
FROM alpine:3.4
|
FROM alpine:3.4
|
||||||
|
ARG version
|
||||||
RUN apk -U add \
|
RUN apk -U add \
|
||||||
python \
|
python \
|
||||||
py-pip
|
py-pip
|
||||||
@ -7,7 +8,7 @@ RUN apk -U add \
|
|||||||
COPY requirements.txt /code/requirements.txt
|
COPY requirements.txt /code/requirements.txt
|
||||||
RUN pip install -r /code/requirements.txt
|
RUN pip install -r /code/requirements.txt
|
||||||
|
|
||||||
ADD dist/docker-compose-release.tar.gz /code/docker-compose
|
COPY dist/docker_compose-${version}-py2.py3-none-any.whl /code/
|
||||||
RUN pip install --no-deps /code/docker-compose/docker-compose-*
|
RUN pip install --no-deps /code/docker_compose-${version}-py2.py3-none-any.whl
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/bin/docker-compose"]
|
ENTRYPOINT ["/usr/bin/docker-compose"]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
__version__ = '1.10.0-rc1'
|
__version__ = '1.10.0-rc2'
|
||||||
|
@ -712,7 +712,7 @@ def finalize_service(service_config, service_names, version, environment):
|
|||||||
if 'volumes' in service_dict:
|
if 'volumes' in service_dict:
|
||||||
service_dict['volumes'] = [
|
service_dict['volumes'] = [
|
||||||
VolumeSpec.parse(
|
VolumeSpec.parse(
|
||||||
v, environment.get('COMPOSE_CONVERT_WINDOWS_PATHS')
|
v, environment.get_boolean('COMPOSE_CONVERT_WINDOWS_PATHS')
|
||||||
) for v in service_dict['volumes']
|
) for v in service_dict['volumes']
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -192,6 +192,7 @@
|
|||||||
"security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
|
"security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
|
||||||
"shm_size": {"type": ["number", "string"]},
|
"shm_size": {"type": ["number", "string"]},
|
||||||
"stdin_open": {"type": "boolean"},
|
"stdin_open": {"type": "boolean"},
|
||||||
|
"stop_grace_period": {"type": "string", "format": "duration"},
|
||||||
"stop_signal": {"type": "string"},
|
"stop_signal": {"type": "string"},
|
||||||
"tmpfs": {"$ref": "#/definitions/string_or_list"},
|
"tmpfs": {"$ref": "#/definitions/string_or_list"},
|
||||||
"tty": {"type": "boolean"},
|
"tty": {"type": "boolean"},
|
||||||
|
@ -217,6 +217,7 @@
|
|||||||
"shm_size": {"type": ["number", "string"]},
|
"shm_size": {"type": ["number", "string"]},
|
||||||
"sysctls": {"$ref": "#/definitions/list_or_dict"},
|
"sysctls": {"$ref": "#/definitions/list_or_dict"},
|
||||||
"stdin_open": {"type": "boolean"},
|
"stdin_open": {"type": "boolean"},
|
||||||
|
"stop_grace_period": {"type": "string", "format": "duration"},
|
||||||
"stop_signal": {"type": "string"},
|
"stop_signal": {"type": "string"},
|
||||||
"tmpfs": {"$ref": "#/definitions/string_or_list"},
|
"tmpfs": {"$ref": "#/definitions/string_or_list"},
|
||||||
"tty": {"type": "boolean"},
|
"tty": {"type": "boolean"},
|
||||||
|
@ -169,8 +169,8 @@
|
|||||||
"shm_size": {"type": ["number", "string"]},
|
"shm_size": {"type": ["number", "string"]},
|
||||||
"sysctls": {"$ref": "#/definitions/list_or_dict"},
|
"sysctls": {"$ref": "#/definitions/list_or_dict"},
|
||||||
"stdin_open": {"type": "boolean"},
|
"stdin_open": {"type": "boolean"},
|
||||||
"stop_signal": {"type": "string"},
|
|
||||||
"stop_grace_period": {"type": "string", "format": "duration"},
|
"stop_grace_period": {"type": "string", "format": "duration"},
|
||||||
|
"stop_signal": {"type": "string"},
|
||||||
"tmpfs": {"$ref": "#/definitions/string_or_list"},
|
"tmpfs": {"$ref": "#/definitions/string_or_list"},
|
||||||
"tty": {"type": "boolean"},
|
"tty": {"type": "boolean"},
|
||||||
"ulimits": {
|
"ulimits": {
|
||||||
@ -270,7 +270,7 @@
|
|||||||
"cpus": {"type": "string"},
|
"cpus": {"type": "string"},
|
||||||
"memory": {"type": "string"}
|
"memory": {"type": "string"}
|
||||||
},
|
},
|
||||||
"additionaProperties": false
|
"additionalProperties": false
|
||||||
},
|
},
|
||||||
|
|
||||||
"network": {
|
"network": {
|
||||||
|
@ -105,3 +105,14 @@ class Environment(dict):
|
|||||||
super(Environment, self).get(key.upper(), *args, **kwargs)
|
super(Environment, self).get(key.upper(), *args, **kwargs)
|
||||||
)
|
)
|
||||||
return super(Environment, self).get(key, *args, **kwargs)
|
return super(Environment, self).get(key, *args, **kwargs)
|
||||||
|
|
||||||
|
def get_boolean(self, key):
|
||||||
|
# Convert a value to a boolean using "common sense" rules.
|
||||||
|
# Unset, empty, "0" and "false" (i-case) yield False.
|
||||||
|
# All other values yield True.
|
||||||
|
value = self.get(key)
|
||||||
|
if not value:
|
||||||
|
return False
|
||||||
|
if value.lower() in ['0', 'false']:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
@ -10,6 +10,7 @@ from operator import attrgetter
|
|||||||
import enum
|
import enum
|
||||||
import six
|
import six
|
||||||
from docker.errors import APIError
|
from docker.errors import APIError
|
||||||
|
from docker.errors import ImageNotFound
|
||||||
from docker.errors import NotFound
|
from docker.errors import NotFound
|
||||||
from docker.types import LogConfig
|
from docker.types import LogConfig
|
||||||
from docker.utils.ports import build_port_bindings
|
from docker.utils.ports import build_port_bindings
|
||||||
@ -323,11 +324,8 @@ class Service(object):
|
|||||||
def image(self):
|
def image(self):
|
||||||
try:
|
try:
|
||||||
return self.client.inspect_image(self.image_name)
|
return self.client.inspect_image(self.image_name)
|
||||||
except APIError as e:
|
except ImageNotFound:
|
||||||
if e.response.status_code == 404 and e.explanation and 'No such image' in str(e.explanation):
|
raise NoSuchImageError("Image '{}' not found".format(self.image_name))
|
||||||
raise NoSuchImageError("Image '{}' not found".format(self.image_name))
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def image_name(self):
|
def image_name(self):
|
||||||
|
@ -2,7 +2,7 @@ PyYAML==3.11
|
|||||||
backports.ssl-match-hostname==3.5.0.1; python_version < '3'
|
backports.ssl-match-hostname==3.5.0.1; python_version < '3'
|
||||||
cached-property==1.2.0
|
cached-property==1.2.0
|
||||||
colorama==0.3.7
|
colorama==0.3.7
|
||||||
docker==2.0.0
|
docker==2.0.1
|
||||||
dockerpty==0.4.1
|
dockerpty==0.4.1
|
||||||
docopt==0.6.1
|
docopt==0.6.1
|
||||||
enum34==1.0.4; python_version < '3.4'
|
enum34==1.0.4; python_version < '3.4'
|
||||||
|
@ -11,6 +11,5 @@ TAG=$1
|
|||||||
VERSION="$(python setup.py --version)"
|
VERSION="$(python setup.py --version)"
|
||||||
|
|
||||||
./script/build/write-git-sha
|
./script/build/write-git-sha
|
||||||
python setup.py sdist
|
python setup.py sdist bdist_wheel
|
||||||
cp dist/docker-compose-$VERSION.tar.gz dist/docker-compose-release.tar.gz
|
docker build --build-arg version=$VERSION -t docker/compose:$TAG -f Dockerfile.run .
|
||||||
docker build -t docker/compose:$TAG -f Dockerfile.run .
|
|
||||||
|
@ -54,13 +54,13 @@ git push $GITHUB_REPO $VERSION
|
|||||||
echo "Uploading the docker image"
|
echo "Uploading the docker image"
|
||||||
docker push docker/compose:$VERSION
|
docker push docker/compose:$VERSION
|
||||||
|
|
||||||
echo "Uploading sdist to PyPI"
|
echo "Uploading package to PyPI"
|
||||||
pandoc -f markdown -t rst README.md -o README.rst
|
pandoc -f markdown -t rst README.md -o README.rst
|
||||||
sed -i -e 's/logo.png?raw=true/https:\/\/github.com\/docker\/compose\/raw\/master\/logo.png?raw=true/' README.rst
|
sed -i -e 's/logo.png?raw=true/https:\/\/github.com\/docker\/compose\/raw\/master\/logo.png?raw=true/' README.rst
|
||||||
./script/build/write-git-sha
|
./script/build/write-git-sha
|
||||||
python setup.py sdist
|
python setup.py sdist bdist_wheel
|
||||||
if [ "$(command -v twine 2> /dev/null)" ]; then
|
if [ "$(command -v twine 2> /dev/null)" ]; then
|
||||||
twine upload ./dist/docker-compose-${VERSION/-/}.tar.gz
|
twine upload ./dist/docker-compose-${VERSION/-/}.tar.gz ./dist/docker-compose-${VERSION/-/}-py2.py3-none-any.whl
|
||||||
else
|
else
|
||||||
python setup.py upload
|
python setup.py upload
|
||||||
fi
|
fi
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
VERSION="1.10.0-rc1"
|
VERSION="1.10.0-rc2"
|
||||||
IMAGE="docker/compose:$VERSION"
|
IMAGE="docker/compose:$VERSION"
|
||||||
|
|
||||||
|
|
||||||
|
27
setup.py
27
setup.py
@ -4,10 +4,12 @@ from __future__ import absolute_import
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import codecs
|
import codecs
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
import pkg_resources
|
||||||
from setuptools import find_packages
|
from setuptools import find_packages
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
|
|
||||||
@ -35,7 +37,7 @@ install_requires = [
|
|||||||
'requests >= 2.6.1, != 2.11.0, < 2.12',
|
'requests >= 2.6.1, != 2.11.0, < 2.12',
|
||||||
'texttable >= 0.8.1, < 0.9',
|
'texttable >= 0.8.1, < 0.9',
|
||||||
'websocket-client >= 0.32.0, < 1.0',
|
'websocket-client >= 0.32.0, < 1.0',
|
||||||
'docker >= 2.0.0, < 3.0',
|
'docker >= 2.0.1, < 3.0',
|
||||||
'dockerpty >= 0.4.1, < 0.5',
|
'dockerpty >= 0.4.1, < 0.5',
|
||||||
'six >= 1.3.0, < 2',
|
'six >= 1.3.0, < 2',
|
||||||
'jsonschema >= 2.5.1, < 3',
|
'jsonschema >= 2.5.1, < 3',
|
||||||
@ -49,7 +51,27 @@ tests_require = [
|
|||||||
|
|
||||||
if sys.version_info[:2] < (3, 4):
|
if sys.version_info[:2] < (3, 4):
|
||||||
tests_require.append('mock >= 1.0.1')
|
tests_require.append('mock >= 1.0.1')
|
||||||
install_requires.append('enum34 >= 1.0.4, < 2')
|
|
||||||
|
extras_require = {
|
||||||
|
':python_version < "3.4"': ['enum34 >= 1.0.4, < 2'],
|
||||||
|
':python_version < "3.5"': ['backports.ssl_match_hostname >= 3.5'],
|
||||||
|
':python_version < "3.3"': ['ipaddress >= 1.0.16'],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
if 'bdist_wheel' not in sys.argv:
|
||||||
|
for key, value in extras_require.items():
|
||||||
|
if key.startswith(':') and pkg_resources.evaluate_marker(key[1:]):
|
||||||
|
install_requires.extend(value)
|
||||||
|
except Exception:
|
||||||
|
logging.getLogger(__name__).exception(
|
||||||
|
'Failed to compute platform dependencies. All dependencies will be '
|
||||||
|
'installed as a result.'
|
||||||
|
)
|
||||||
|
for key, value in extras_require.items():
|
||||||
|
if key.startswith(':'):
|
||||||
|
install_requires.extend(value)
|
||||||
|
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
@ -63,6 +85,7 @@ setup(
|
|||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
test_suite='nose.collector',
|
test_suite='nose.collector',
|
||||||
install_requires=install_requires,
|
install_requires=install_requires,
|
||||||
|
extras_require=extras_require,
|
||||||
tests_require=tests_require,
|
tests_require=tests_require,
|
||||||
entry_points="""
|
entry_points="""
|
||||||
[console_scripts]
|
[console_scripts]
|
||||||
|
40
tests/unit/config/environment_test.py
Normal file
40
tests/unit/config/environment_test.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from compose.config.environment import Environment
|
||||||
|
from tests import unittest
|
||||||
|
|
||||||
|
|
||||||
|
class EnvironmentTest(unittest.TestCase):
|
||||||
|
def test_get_simple(self):
|
||||||
|
env = Environment({
|
||||||
|
'FOO': 'bar',
|
||||||
|
'BAR': '1',
|
||||||
|
'BAZ': ''
|
||||||
|
})
|
||||||
|
|
||||||
|
assert env.get('FOO') == 'bar'
|
||||||
|
assert env.get('BAR') == '1'
|
||||||
|
assert env.get('BAZ') == ''
|
||||||
|
|
||||||
|
def test_get_undefined(self):
|
||||||
|
env = Environment({
|
||||||
|
'FOO': 'bar'
|
||||||
|
})
|
||||||
|
assert env.get('FOOBAR') is None
|
||||||
|
|
||||||
|
def test_get_boolean(self):
|
||||||
|
env = Environment({
|
||||||
|
'FOO': '',
|
||||||
|
'BAR': '0',
|
||||||
|
'BAZ': 'FALSE',
|
||||||
|
'FOOBAR': 'true',
|
||||||
|
})
|
||||||
|
|
||||||
|
assert env.get_boolean('FOO') is False
|
||||||
|
assert env.get_boolean('BAR') is False
|
||||||
|
assert env.get_boolean('BAZ') is False
|
||||||
|
assert env.get_boolean('FOOBAR') is True
|
||||||
|
assert env.get_boolean('UNDEFINED') is False
|
Loading…
x
Reference in New Issue
Block a user