summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorentin Henry <corentinhenry@gmail.com>2018-12-12 12:29:06 +0100
committerJoffrey F <joffrey@docker.com>2019-01-09 11:30:58 -0800
commitbfdd0a881ea10e0f09a90a5282ccb1e023e1ba75 (patch)
tree89add90e593fc7952a27d09d516f4d1a62b0225c
parent4ca4e94ea71c0232698f94a0dad424c91326f031 (diff)
downloaddocker-py-bfdd0a881ea10e0f09a90a5282ccb1e023e1ba75.tar.gz
add support for proxies
Signed-off-by: Corentin Henry <corentinhenry@gmail.com>
-rw-r--r--docker/api/build.py5
-rw-r--r--docker/api/client.py7
-rw-r--r--docker/api/container.py4
-rw-r--r--docker/api/exec_api.py1
-rw-r--r--docker/utils/proxy.py69
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)