summaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2015-09-16 14:09:50 -0700
committerJoffrey F <joffrey@docker.com>2015-10-14 17:26:50 -0700
commit147df4d21feed69ff19a7da99577ba8e7b110b3b (patch)
treef17d462f50e1577e8170e367b5b8295c9975a1dd /docker
parent6a66a2248d997e2effa98b4cc82546bdd31048c7 (diff)
downloaddocker-py-147df4d21feed69ff19a7da99577ba8e7b110b3b.tar.gz
put/get archive implementation
Signed-off-by: Joffrey F <joffrey@docker.com>
Diffstat (limited to 'docker')
-rw-r--r--docker/api/container.py30
-rw-r--r--docker/client.py3
-rw-r--r--docker/utils/__init__.py2
-rw-r--r--docker/utils/utils.py8
4 files changed, 42 insertions, 1 deletions
diff --git a/docker/api/container.py b/docker/api/container.py
index 94889e9..142bd0f 100644
--- a/docker/api/container.py
+++ b/docker/api/container.py
@@ -75,6 +75,12 @@ class ContainerApiMixin(object):
@utils.check_resource
def copy(self, container, resource):
+ if utils.version_gte(self._version, '1.20'):
+ warnings.warn(
+ 'Client.copy() is deprecated for API version >= 1.20, '
+ 'please use get_archive() instead',
+ DeprecationWarning
+ )
res = self._post_json(
self._url("/containers/{0}/copy".format(container)),
data={"Resource": resource},
@@ -146,6 +152,21 @@ class ContainerApiMixin(object):
return res.raw
@utils.check_resource
+ @utils.minimum_version('1.20')
+ def get_archive(self, container, path):
+ params = {
+ 'path': path
+ }
+ url = self._url('/containers/{0}/archive', container)
+ res = self._get(url, params=params, stream=True)
+ self._raise_for_status(res)
+ encoded_stat = res.headers.get('x-docker-container-path-stat')
+ return (
+ res.raw,
+ utils.decode_json_header(encoded_stat) if encoded_stat else None
+ )
+
+ @utils.check_resource
def inspect_container(self, container):
return self._result(
self._get(self._url("/containers/{0}/json", container)), True
@@ -215,6 +236,15 @@ class ContainerApiMixin(object):
return h_ports
@utils.check_resource
+ @utils.minimum_version('1.20')
+ def put_archive(self, container, path, data):
+ params = {'path': path}
+ url = self._url('/containers/{0}/archive', container)
+ res = self._put(url, params=params, data=data)
+ self._raise_for_status(res)
+ return res.status_code == 200
+
+ @utils.check_resource
def remove_container(self, container, v=False, link=False, force=False):
params = {'v': v, 'link': link, 'force': force}
res = self._delete(
diff --git a/docker/client.py b/docker/client.py
index 79efc9f..d219472 100644
--- a/docker/client.py
+++ b/docker/client.py
@@ -109,6 +109,9 @@ class Client(
def _get(self, url, **kwargs):
return self.get(url, **self._set_request_timeout(kwargs))
+ def _put(self, url, **kwargs):
+ return self.put(url, **self._set_request_timeout(kwargs))
+
def _delete(self, url, **kwargs):
return self.delete(url, **self._set_request_timeout(kwargs))
diff --git a/docker/utils/__init__.py b/docker/utils/__init__.py
index fd0ef5c..92e03e9 100644
--- a/docker/utils/__init__.py
+++ b/docker/utils/__init__.py
@@ -3,7 +3,7 @@ from .utils import (
mkbuildcontext, tar, exclude_paths, parse_repository_tag, parse_host,
kwargs_from_env, convert_filters, create_host_config,
create_container_config, parse_bytes, ping_registry, parse_env_file,
- version_lt, version_gte
+ version_lt, version_gte, decode_json_header
) # flake8: noqa
from .types import Ulimit, LogConfig # flake8: noqa
diff --git a/docker/utils/utils.py b/docker/utils/utils.py
index 1fce137..89837b7 100644
--- a/docker/utils/utils.py
+++ b/docker/utils/utils.py
@@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import base64
import io
import os
import os.path
@@ -66,6 +67,13 @@ def mkbuildcontext(dockerfile):
return f
+def decode_json_header(header):
+ data = base64.b64decode(header)
+ if six.PY3:
+ data = data.decode('utf-8')
+ return json.loads(data)
+
+
def tar(path, exclude=None, dockerfile=None):
f = tempfile.NamedTemporaryFile()
t = tarfile.open(mode='w', fileobj=f)