mirror of https://github.com/docker/docs.git
Merge pull request #1963 from shin-/1923-catch-timeout
Exit gracefully when requests encounter a ReadTimeout exception.
This commit is contained in:
commit
10cb0c921a
|
@ -1,9 +1,14 @@
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import ssl
|
import ssl
|
||||||
|
|
||||||
from docker import Client
|
from docker import Client
|
||||||
from docker import tls
|
from docker import tls
|
||||||
|
|
||||||
|
from ..const import HTTP_TIMEOUT
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def docker_client():
|
def docker_client():
|
||||||
"""
|
"""
|
||||||
|
@ -34,5 +39,7 @@ def docker_client():
|
||||||
ca_cert=ca_cert,
|
ca_cert=ca_cert,
|
||||||
)
|
)
|
||||||
|
|
||||||
timeout = int(os.environ.get('DOCKER_CLIENT_TIMEOUT', 60))
|
if 'DOCKER_CLIENT_TIMEOUT' in os.environ:
|
||||||
return Client(base_url=base_url, tls=tls_config, version=api_version, timeout=timeout)
|
log.warn('The DOCKER_CLIENT_TIMEOUT environment variable is deprecated. Please use COMPOSE_HTTP_TIMEOUT instead.')
|
||||||
|
|
||||||
|
return Client(base_url=base_url, tls=tls_config, version=api_version, timeout=HTTP_TIMEOUT)
|
||||||
|
|
|
@ -10,11 +10,13 @@ from operator import attrgetter
|
||||||
|
|
||||||
import dockerpty
|
import dockerpty
|
||||||
from docker.errors import APIError
|
from docker.errors import APIError
|
||||||
|
from requests.exceptions import ReadTimeout
|
||||||
|
|
||||||
from .. import __version__
|
from .. import __version__
|
||||||
from .. import legacy
|
from .. import legacy
|
||||||
from ..config import parse_environment
|
from ..config import parse_environment
|
||||||
from ..const import DEFAULT_TIMEOUT
|
from ..const import DEFAULT_TIMEOUT
|
||||||
|
from ..const import HTTP_TIMEOUT
|
||||||
from ..progress_stream import StreamOutputError
|
from ..progress_stream import StreamOutputError
|
||||||
from ..project import ConfigurationError
|
from ..project import ConfigurationError
|
||||||
from ..project import NoSuchService
|
from ..project import NoSuchService
|
||||||
|
@ -66,6 +68,12 @@ def main():
|
||||||
except NeedsBuildError as e:
|
except NeedsBuildError as e:
|
||||||
log.error("Service '%s' needs to be built, but --no-build was passed." % e.service.name)
|
log.error("Service '%s' needs to be built, but --no-build was passed." % e.service.name)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
except ReadTimeout as e:
|
||||||
|
log.error(
|
||||||
|
"An HTTP request took too long to complete. Retry with --verbose to obtain debug information.\n"
|
||||||
|
"If you encounter this issue regularly because of slow network conditions, consider setting "
|
||||||
|
"COMPOSE_HTTP_TIMEOUT to a higher value (current value: %s)." % HTTP_TIMEOUT
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def setup_logging():
|
def setup_logging():
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import os
|
||||||
|
|
||||||
DEFAULT_TIMEOUT = 10
|
DEFAULT_TIMEOUT = 10
|
||||||
LABEL_CONTAINER_NUMBER = 'com.docker.compose.container-number'
|
LABEL_CONTAINER_NUMBER = 'com.docker.compose.container-number'
|
||||||
|
@ -6,3 +7,4 @@ LABEL_PROJECT = 'com.docker.compose.project'
|
||||||
LABEL_SERVICE = 'com.docker.compose.service'
|
LABEL_SERVICE = 'com.docker.compose.service'
|
||||||
LABEL_VERSION = 'com.docker.compose.version'
|
LABEL_VERSION = 'com.docker.compose.version'
|
||||||
LABEL_CONFIG_HASH = 'com.docker.compose.config-hash'
|
LABEL_CONFIG_HASH = 'com.docker.compose.config-hash'
|
||||||
|
HTTP_TIMEOUT = int(os.environ.get('COMPOSE_HTTP_TIMEOUT', os.environ.get('DOCKER_CLIENT_TIMEOUT', 60)))
|
||||||
|
|
|
@ -44,6 +44,11 @@ the `docker` daemon.
|
||||||
|
|
||||||
Configures the path to the `ca.pem`, `cert.pem`, and `key.pem` files used for TLS verification. Defaults to `~/.docker`.
|
Configures the path to the `ca.pem`, `cert.pem`, and `key.pem` files used for TLS verification. Defaults to `~/.docker`.
|
||||||
|
|
||||||
|
### COMPOSE\_HTTP\_TIMEOUT
|
||||||
|
|
||||||
|
Configures the time (in seconds) a request to the Docker daemon is allowed to hang before Compose considers
|
||||||
|
it failed. Defaults to 60 seconds.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ class DockerClientTestCase(unittest.TestCase):
|
||||||
docker_client.docker_client()
|
docker_client.docker_client()
|
||||||
|
|
||||||
def test_docker_client_with_custom_timeout(self):
|
def test_docker_client_with_custom_timeout(self):
|
||||||
with mock.patch.dict(os.environ):
|
timeout = 300
|
||||||
os.environ['DOCKER_CLIENT_TIMEOUT'] = timeout = "300"
|
with mock.patch('compose.cli.docker_client.HTTP_TIMEOUT', 300):
|
||||||
client = docker_client.docker_client()
|
client = docker_client.docker_client()
|
||||||
self.assertEqual(client.timeout, int(timeout))
|
self.assertEqual(client.timeout, int(timeout))
|
||||||
|
|
Loading…
Reference in New Issue