Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions docker/api/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -698,7 +698,7 @@ def export(self, container):
container (str): The container to export

Returns:
(str): The filesystem tar archive
(generator): The archived filesystem data stream

Raises:
:py:class:`docker.errors.APIError`
Expand All @@ -707,8 +707,7 @@ def export(self, container):
res = self._get(
self._url("/containers/{0}/export", container), stream=True
)
self._raise_for_status(res)
return res.raw
return self._stream_raw_result(res)

@utils.check_resource('container')
@utils.minimum_version('1.20')
Expand Down Expand Up @@ -737,7 +736,7 @@ def get_archive(self, container, path):
self._raise_for_status(res)
encoded_stat = res.headers.get('x-docker-container-path-stat')
return (
res.raw,
self._stream_raw_result(res),
utils.decode_json_header(encoded_stat) if encoded_stat else None
)

Expand Down
13 changes: 6 additions & 7 deletions docker/api/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,22 @@ def get_image(self, image):
image (str): Image name to get

Returns:
(urllib3.response.HTTPResponse object): The response from the
daemon.
(generator): A stream of raw archive data.

Raises:
:py:class:`docker.errors.APIError`
If the server returns an error.

Example:

>>> image = cli.get_image("fedora:latest")
>>> f = open('/tmp/fedora-latest.tar', 'w')
>>> f.write(image.data)
>>> image = cli.get_image("busybox:latest")
>>> f = open('/tmp/busybox-latest.tar', 'w')
>>> for chunk in image:
>>> f.write(chunk)
>>> f.close()
"""
res = self._get(self._url("/images/{0}/get", image), stream=True)
self._raise_for_status(res)
return res.raw
return self._stream_raw_result(res)

@utils.check_resource('image')
def history(self, image):
Expand Down
12 changes: 5 additions & 7 deletions docker/models/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,20 +61,18 @@ def save(self):
Get a tarball of an image. Similar to the ``docker save`` command.

Returns:
(urllib3.response.HTTPResponse object): The response from the
daemon.
(generator): A stream of raw archive data.

Raises:
:py:class:`docker.errors.APIError`
If the server returns an error.

Example:

>>> image = cli.images.get("fedora:latest")
>>> resp = image.save()
>>> f = open('/tmp/fedora-latest.tar', 'w')
>>> for chunk in resp.stream():
>>> f.write(chunk)
>>> image = cli.get_image("busybox:latest")
>>> f = open('/tmp/busybox-latest.tar', 'w')
>>> for chunk in image:
>>> f.write(chunk)
>>> f.close()
"""
return self.client.api.get_image(self.id)
Expand Down
24 changes: 23 additions & 1 deletion tests/integration/api_image_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ def test_prune_images(self):
img_id = self.client.inspect_image('hello-world')['Id']
result = self.client.prune_images()
assert img_id not in [
img.get('Deleted') for img in result['ImagesDeleted']
img.get('Deleted') for img in result.get('ImagesDeleted') or []
]
result = self.client.prune_images({'dangling': False})
assert result['SpaceReclaimed'] > 0
Expand All @@ -339,3 +339,25 @@ def test_prune_images(self):
assert img_id in [
img.get('Deleted') for img in result['ImagesDeleted']
]


class SaveLoadImagesTest(BaseAPIIntegrationTest):
@requires_api_version('1.23')
def test_get_image_load_image(self):
with tempfile.TemporaryFile() as f:
stream = self.client.get_image(BUSYBOX)
for chunk in stream:
f.write(chunk)

f.seek(0)
result = self.client.load_image(f.read())

success = False
result_line = 'Loaded image: {}\n'.format(BUSYBOX)
for data in result:
print(data)
if 'stream' in data:
if data['stream'] == result_line:
success = True
break
assert success is True
17 changes: 16 additions & 1 deletion tests/integration/models_images_test.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import io
import tempfile

import docker
import pytest

from .base import BaseIntegrationTest, TEST_API_VERSION
from .base import BaseIntegrationTest, BUSYBOX, TEST_API_VERSION


class ImageCollectionTest(BaseIntegrationTest):
Expand Down Expand Up @@ -76,6 +77,20 @@ def test_load_error(self):
with pytest.raises(docker.errors.ImageLoadError):
client.images.load('abc')

def test_save_and_load(self):
client = docker.from_env(version=TEST_API_VERSION)
image = client.images.get(BUSYBOX)
with tempfile.TemporaryFile() as f:
stream = image.save()
for chunk in stream:
f.write(chunk)

f.seek(0)
result = client.images.load(f.read())

assert len(result) == 1
assert result[0].id == image.id


class ImageTest(BaseIntegrationTest):

Expand Down