mirror of https://github.com/docker/docker-py.git
Add named parameter to image.save to identify which repository name to use in the resulting tarball
Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
parent
7252086054
commit
e237c0ea16
|
@ -59,7 +59,7 @@ class Image(Model):
|
||||||
"""
|
"""
|
||||||
return self.client.api.history(self.id)
|
return self.client.api.history(self.id)
|
||||||
|
|
||||||
def save(self, chunk_size=DEFAULT_DATA_CHUNK_SIZE):
|
def save(self, chunk_size=DEFAULT_DATA_CHUNK_SIZE, named=False):
|
||||||
"""
|
"""
|
||||||
Get a tarball of an image. Similar to the ``docker save`` command.
|
Get a tarball of an image. Similar to the ``docker save`` command.
|
||||||
|
|
||||||
|
@ -67,6 +67,12 @@ class Image(Model):
|
||||||
chunk_size (int): The generator will return up to that much data
|
chunk_size (int): The generator will return up to that much data
|
||||||
per iteration, but may return less. If ``None``, data will be
|
per iteration, but may return less. If ``None``, data will be
|
||||||
streamed as it is received. Default: 2 MB
|
streamed as it is received. Default: 2 MB
|
||||||
|
named (str or bool): If ``False`` (default), the tarball will not
|
||||||
|
retain repository and tag information for this image. If set
|
||||||
|
to ``True``, the first tag in the :py:attr:`~tags` list will
|
||||||
|
be used to identify the image. Alternatively, any element of
|
||||||
|
the :py:attr:`~tags` list can be used as an argument to use
|
||||||
|
that specific tag as the saved identifier.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
(generator): A stream of raw archive data.
|
(generator): A stream of raw archive data.
|
||||||
|
@ -83,7 +89,17 @@ class Image(Model):
|
||||||
>>> f.write(chunk)
|
>>> f.write(chunk)
|
||||||
>>> f.close()
|
>>> f.close()
|
||||||
"""
|
"""
|
||||||
return self.client.api.get_image(self.id, chunk_size)
|
img = self.id
|
||||||
|
if named:
|
||||||
|
img = self.tags[0] if self.tags else img
|
||||||
|
if isinstance(named, six.string_types):
|
||||||
|
if named not in self.tags:
|
||||||
|
raise InvalidArgument(
|
||||||
|
"{} is not a valid tag for this image".format(named)
|
||||||
|
)
|
||||||
|
img = named
|
||||||
|
|
||||||
|
return self.client.api.get_image(img, chunk_size)
|
||||||
|
|
||||||
def tag(self, repository, tag=None, **kwargs):
|
def tag(self, repository, tag=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -5,6 +5,7 @@ import docker
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from .base import BaseIntegrationTest, BUSYBOX, TEST_API_VERSION
|
from .base import BaseIntegrationTest, BUSYBOX, TEST_API_VERSION
|
||||||
|
from ..helpers import random_name
|
||||||
|
|
||||||
|
|
||||||
class ImageCollectionTest(BaseIntegrationTest):
|
class ImageCollectionTest(BaseIntegrationTest):
|
||||||
|
@ -108,6 +109,32 @@ class ImageCollectionTest(BaseIntegrationTest):
|
||||||
assert len(result) == 1
|
assert len(result) == 1
|
||||||
assert result[0].id == image.id
|
assert result[0].id == image.id
|
||||||
|
|
||||||
|
def test_save_and_load_repo_name(self):
|
||||||
|
client = docker.from_env(version=TEST_API_VERSION)
|
||||||
|
image = client.images.get(BUSYBOX)
|
||||||
|
additional_tag = random_name()
|
||||||
|
image.tag(additional_tag)
|
||||||
|
self.tmp_imgs.append(additional_tag)
|
||||||
|
image.reload()
|
||||||
|
with tempfile.TemporaryFile() as f:
|
||||||
|
stream = image.save(named='{}:latest'.format(additional_tag))
|
||||||
|
for chunk in stream:
|
||||||
|
f.write(chunk)
|
||||||
|
|
||||||
|
f.seek(0)
|
||||||
|
client.images.remove(additional_tag, force=True)
|
||||||
|
result = client.images.load(f.read())
|
||||||
|
|
||||||
|
assert len(result) == 1
|
||||||
|
assert result[0].id == image.id
|
||||||
|
assert '{}:latest'.format(additional_tag) in result[0].tags
|
||||||
|
|
||||||
|
def test_save_name_error(self):
|
||||||
|
client = docker.from_env(version=TEST_API_VERSION)
|
||||||
|
image = client.images.get(BUSYBOX)
|
||||||
|
with pytest.raises(docker.errors.InvalidArgument):
|
||||||
|
image.save(named='sakuya/izayoi')
|
||||||
|
|
||||||
|
|
||||||
class ImageTest(BaseIntegrationTest):
|
class ImageTest(BaseIntegrationTest):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue