summaryrefslogtreecommitdiff
path: root/docker/api
diff options
context:
space:
mode:
Diffstat (limited to 'docker/api')
-rw-r--r--docker/api/build.py31
-rw-r--r--docker/api/client.py6
-rw-r--r--docker/api/config.py8
-rw-r--r--docker/api/container.py17
-rw-r--r--docker/api/daemon.py4
-rw-r--r--docker/api/plugin.py15
6 files changed, 64 insertions, 17 deletions
diff --git a/docker/api/build.py b/docker/api/build.py
index d69985e..419255f 100644
--- a/docker/api/build.py
+++ b/docker/api/build.py
@@ -264,6 +264,23 @@ class BuildApiMixin(object):
return self._stream_helper(response, decode=decode)
+ @utils.minimum_version('1.31')
+ def prune_builds(self):
+ """
+ Delete the builder cache
+
+ Returns:
+ (dict): A dictionary containing information about the operation's
+ result. The ``SpaceReclaimed`` key indicates the amount of
+ bytes of disk space reclaimed.
+
+ Raises:
+ :py:class:`docker.errors.APIError`
+ If the server returns an error.
+ """
+ url = self._url("/build/prune")
+ return self._result(self._post(url), True)
+
def _set_auth_headers(self, headers):
log.debug('Looking for auth config')
@@ -285,7 +302,8 @@ class BuildApiMixin(object):
# credentials/native_store.go#L68-L83
for registry in self._auth_configs.get('auths', {}).keys():
auth_data[registry] = auth.resolve_authconfig(
- self._auth_configs, registry
+ self._auth_configs, registry,
+ credstore_env=self.credstore_env,
)
else:
auth_data = self._auth_configs.get('auths', {}).copy()
@@ -316,10 +334,17 @@ def process_dockerfile(dockerfile, path):
if (os.path.splitdrive(path)[0] != os.path.splitdrive(abs_dockerfile)[0] or
os.path.relpath(abs_dockerfile, path).startswith('..')):
+ # Dockerfile not in context - read data to insert into tar later
with open(abs_dockerfile, 'r') as df:
return (
'.dockerfile.{0:x}'.format(random.getrandbits(160)),
df.read()
)
- else:
- return (dockerfile, None)
+
+ # Dockerfile is inside the context - return path relative to context root
+ if dockerfile == abs_dockerfile:
+ # Only calculate relpath if necessary to avoid errors
+ # on Windows client -> Linux Docker
+ # see https://github.com/docker/compose/issues/5969
+ dockerfile = os.path.relpath(abs_dockerfile, path)
+ return (dockerfile, None)
diff --git a/docker/api/client.py b/docker/api/client.py
index 13c292a..91da1c8 100644
--- a/docker/api/client.py
+++ b/docker/api/client.py
@@ -83,6 +83,8 @@ class APIClient(
:py:class:`~docker.tls.TLSConfig` object to use custom
configuration.
user_agent (str): Set a custom user agent for requests to the server.
+ credstore_env (dict): Override environment variables when calling the
+ credential store process.
"""
__attrs__ = requests.Session.__attrs__ + ['_auth_configs',
@@ -93,7 +95,8 @@ class APIClient(
def __init__(self, base_url=None, version=None,
timeout=DEFAULT_TIMEOUT_SECONDS, tls=False,
- user_agent=DEFAULT_USER_AGENT, num_pools=DEFAULT_NUM_POOLS):
+ user_agent=DEFAULT_USER_AGENT, num_pools=DEFAULT_NUM_POOLS,
+ credstore_env=None):
super(APIClient, self).__init__()
if tls and not base_url:
@@ -109,6 +112,7 @@ class APIClient(
self._auth_configs = auth.load_config(
config_dict=self._general_configs
)
+ self.credstore_env = credstore_env
base_url = utils.parse_host(
base_url, IS_WINDOWS_PLATFORM, tls=bool(tls)
diff --git a/docker/api/config.py b/docker/api/config.py
index b46b09c..767bef2 100644
--- a/docker/api/config.py
+++ b/docker/api/config.py
@@ -6,7 +6,7 @@ from .. import utils
class ConfigApiMixin(object):
- @utils.minimum_version('1.25')
+ @utils.minimum_version('1.30')
def create_config(self, name, data, labels=None):
"""
Create a config
@@ -35,7 +35,7 @@ class ConfigApiMixin(object):
self._post_json(url, data=body), True
)
- @utils.minimum_version('1.25')
+ @utils.minimum_version('1.30')
@utils.check_resource('id')
def inspect_config(self, id):
"""
@@ -53,7 +53,7 @@ class ConfigApiMixin(object):
url = self._url('/configs/{0}', id)
return self._result(self._get(url), True)
- @utils.minimum_version('1.25')
+ @utils.minimum_version('1.30')
@utils.check_resource('id')
def remove_config(self, id):
"""
@@ -73,7 +73,7 @@ class ConfigApiMixin(object):
self._raise_for_status(res)
return True
- @utils.minimum_version('1.25')
+ @utils.minimum_version('1.30')
def configs(self, filters=None):
"""
List configs
diff --git a/docker/api/container.py b/docker/api/container.py
index cb97b79..d4f75f5 100644
--- a/docker/api/container.py
+++ b/docker/api/container.py
@@ -139,8 +139,9 @@ class ContainerApiMixin(object):
'changes': changes
}
u = self._url("/commit")
- return self._result(self._post_json(u, data=conf, params=params),
- json=True)
+ return self._result(
+ self._post_json(u, data=conf, params=params), json=True
+ )
def containers(self, quiet=False, all=False, trunc=False, latest=False,
since=None, before=None, limit=-1, size=False,
@@ -1018,7 +1019,10 @@ class ContainerApiMixin(object):
"""
params = {'t': timeout}
url = self._url("/containers/{0}/restart", container)
- res = self._post(url, params=params)
+ conn_timeout = self.timeout
+ if conn_timeout is not None:
+ conn_timeout += timeout
+ res = self._post(url, params=params, timeout=conn_timeout)
self._raise_for_status(res)
@utils.check_resource('container')
@@ -1107,9 +1111,10 @@ class ContainerApiMixin(object):
else:
params = {'t': timeout}
url = self._url("/containers/{0}/stop", container)
-
- res = self._post(url, params=params,
- timeout=(timeout + (self.timeout or 0)))
+ conn_timeout = self.timeout
+ if conn_timeout is not None:
+ conn_timeout += timeout
+ res = self._post(url, params=params, timeout=conn_timeout)
self._raise_for_status(res)
@utils.check_resource('container')
diff --git a/docker/api/daemon.py b/docker/api/daemon.py
index fc3692c..76a94cf 100644
--- a/docker/api/daemon.py
+++ b/docker/api/daemon.py
@@ -128,7 +128,9 @@ class DaemonApiMixin(object):
elif not self._auth_configs:
self._auth_configs = auth.load_config()
- authcfg = auth.resolve_authconfig(self._auth_configs, registry)
+ authcfg = auth.resolve_authconfig(
+ self._auth_configs, registry, credstore_env=self.credstore_env,
+ )
# If we found an existing auth config for this registry and username
# combination, we can return it immediately unless reauth is requested.
if authcfg and authcfg.get('username', None) == username \
diff --git a/docker/api/plugin.py b/docker/api/plugin.py
index 73f1852..f6c0b13 100644
--- a/docker/api/plugin.py
+++ b/docker/api/plugin.py
@@ -44,7 +44,10 @@ class PluginApiMixin(object):
"""
url = self._url('/plugins/create')
- with utils.create_archive(root=plugin_data_dir, gzip=gzip) as archv:
+ with utils.create_archive(
+ root=plugin_data_dir, gzip=gzip,
+ files=set(utils.build.walk(plugin_data_dir, []))
+ ) as archv:
res = self._post(url, params={'name': name}, data=archv)
self._raise_for_status(res)
return True
@@ -167,8 +170,16 @@ class PluginApiMixin(object):
'remote': name,
}
+ headers = {}
+ registry, repo_name = auth.resolve_repository_name(name)
+ header = auth.get_config_header(self, registry)
+ if header:
+ headers['X-Registry-Auth'] = header
+
url = self._url('/plugins/privileges')
- return self._result(self._get(url, params=params), True)
+ return self._result(
+ self._get(url, params=params, headers=headers), True
+ )
@utils.minimum_version('1.25')
@utils.check_resource('name')