diff options
author | Corentin Henry <corentinhenry@gmail.com> | 2018-12-12 12:29:06 +0100 |
---|---|---|
committer | Joffrey F <joffrey@docker.com> | 2019-01-09 11:30:58 -0800 |
commit | bfdd0a881ea10e0f09a90a5282ccb1e023e1ba75 (patch) | |
tree | 89add90e593fc7952a27d09d516f4d1a62b0225c | |
parent | 4ca4e94ea71c0232698f94a0dad424c91326f031 (diff) | |
download | docker-py-bfdd0a881ea10e0f09a90a5282ccb1e023e1ba75.tar.gz |
add support for proxies
Signed-off-by: Corentin Henry <corentinhenry@gmail.com>
-rw-r--r-- | docker/api/build.py | 5 | ||||
-rw-r--r-- | docker/api/client.py | 7 | ||||
-rw-r--r-- | docker/api/container.py | 4 | ||||
-rw-r--r-- | docker/api/exec_api.py | 1 | ||||
-rw-r--r-- | docker/utils/proxy.py | 69 |
5 files changed, 85 insertions, 1 deletions
diff --git a/docker/api/build.py b/docker/api/build.py index 5db5838..0871df8 100644 --- a/docker/api/build.py +++ b/docker/api/build.py @@ -168,8 +168,11 @@ class BuildApiMixin(object): } params.update(container_limits) + final_buildargs = self._proxy_configs.get_environment() if buildargs: - params.update({'buildargs': json.dumps(buildargs)}) + final_buildargs.update(buildargs) + if final_buildargs: + params.update({'buildargs': json.dumps(final_buildargs)}) if shmsize: if utils.version_gte(self._version, '1.22'): diff --git a/docker/api/client.py b/docker/api/client.py index 265dfdc..b12398e 100644 --- a/docker/api/client.py +++ b/docker/api/client.py @@ -34,6 +34,7 @@ from ..transport import SSLAdapter, UnixAdapter from ..utils import utils, check_resource, update_headers, config from ..utils.socket import frames_iter, consume_socket_output, demux_adaptor from ..utils.json_stream import json_stream +from ..utils.proxy import ProxyConfig try: from ..transport import NpipeAdapter except ImportError: @@ -114,6 +115,12 @@ class APIClient( self.headers['User-Agent'] = user_agent self._general_configs = config.load_general_config() + try: + proxies = self._general_configs['proxies']['default'] + except KeyError: + proxies = {} + self._proxy_configs = ProxyConfig.from_dict(proxies) + self._auth_configs = auth.load_config( config_dict=self._general_configs, credstore_env=credstore_env, ) diff --git a/docker/api/container.py b/docker/api/container.py index ab3b1cf..2a80ff7 100644 --- a/docker/api/container.py +++ b/docker/api/container.py @@ -403,6 +403,10 @@ class ContainerApiMixin(object): if isinstance(volumes, six.string_types): volumes = [volumes, ] + if isinstance(environment, dict): + environment = utils.utils.format_environment(environment) + environment = self._proxy_configs.inject_proxy_environment(environment) + config = self.create_container_config( image, command, hostname, user, detach, stdin_open, tty, ports, environment, volumes, diff --git a/docker/api/exec_api.py b/docker/api/exec_api.py index d13b128..0dabdd3 100644 --- a/docker/api/exec_api.py +++ b/docker/api/exec_api.py @@ -50,6 +50,7 @@ class ExecApiMixin(object): if isinstance(environment, dict): environment = utils.utils.format_environment(environment) + environment = self._proxy_configs.inject_proxy_environment(environment) data = { 'Container': container, diff --git a/docker/utils/proxy.py b/docker/utils/proxy.py new file mode 100644 index 0000000..3f55a3c --- /dev/null +++ b/docker/utils/proxy.py @@ -0,0 +1,69 @@ +from .utils import format_environment + + +class ProxyConfig(): + ''' + Hold the client's proxy configuration + ''' + + def __init__(self, http=None, https=None, ftp=None, no_proxy=None): + self.http = http + self.https = https + self.ftp = ftp + self.no_proxy = no_proxy + + @staticmethod + def from_dict(config): + ''' + Instantiate a new ProxyConfig from a dictionary that represents a + client configuration, as described in `the documentation`_. + + .. _the documentation: + https://docs.docker.com/network/proxy/#configure-the-docker-client + ''' + return ProxyConfig( + http=config.get('httpProxy', None), + https=config.get('httpsProxy', None), + ftp=config.get('ftpProxy', None), + no_proxy=config.get('noProxy', None)) + + def get_environment(self): + ''' + Return a dictionary representing the environment variables used to + set the proxy settings. + ''' + env = {} + if self.http: + env['http_proxy'] = env['HTTP_PROXY'] = self.http + if self.https: + env['https_proxy'] = env['HTTPS_PROXY'] = self.https + if self.ftp: + env['ftp_proxy'] = env['FTP_PROXY'] = self.ftp + if self.no_proxy: + env['no_proxy'] = env['NO_PROXY'] = self.no_proxy + return env + + def inject_proxy_environment(self, environment): + ''' + Given a list of strings representing environment variables, prepend the + environemt variables corresponding to the proxy settings. + ''' + if not self: + return environment + + proxy_env = format_environment(self.get_environment()) + if not environment: + return proxy_env + # It is important to prepend our variables, because we want the + # variables defined in "environment" to take precedence. + return proxy_env + environment + + def __bool__(self): + return bool(self.http or self.https or self.ftp or self.no_proxy) + + def __nonzero__(self): + return self.__bool__() + + def __str__(self): + return 'ProxyConfig(http={}, https={}, ftp={}, no_proxy={})'.format( + self.http, self.https, self.ftp, self.no_proxy) |