mirror of https://github.com/docker/docker-py.git
Properly support pulling all tags in DockerClient.images.pull
Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
parent
a05922e949
commit
17aa31456d
|
|
@ -5,6 +5,7 @@ import six
|
||||||
|
|
||||||
from ..api import APIClient
|
from ..api import APIClient
|
||||||
from ..errors import BuildError, ImageLoadError
|
from ..errors import BuildError, ImageLoadError
|
||||||
|
from ..utils import parse_repository_tag
|
||||||
from ..utils.json_stream import json_stream
|
from ..utils.json_stream import json_stream
|
||||||
from .resource import Collection, Model
|
from .resource import Collection, Model
|
||||||
|
|
||||||
|
|
@ -269,6 +270,8 @@ class ImageCollection(Collection):
|
||||||
"""
|
"""
|
||||||
Pull an image of the given name and return it. Similar to the
|
Pull an image of the given name and return it. Similar to the
|
||||||
``docker pull`` command.
|
``docker pull`` command.
|
||||||
|
If no tag is specified, all tags from that repository will be
|
||||||
|
pulled.
|
||||||
|
|
||||||
If you want to get the raw pull output, use the
|
If you want to get the raw pull output, use the
|
||||||
:py:meth:`~docker.api.image.ImageApiMixin.pull` method in the
|
:py:meth:`~docker.api.image.ImageApiMixin.pull` method in the
|
||||||
|
|
@ -285,7 +288,9 @@ class ImageCollection(Collection):
|
||||||
platform (str): Platform in the format ``os[/arch[/variant]]``
|
platform (str): Platform in the format ``os[/arch[/variant]]``
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
(:py:class:`Image`): The image that has been pulled.
|
(:py:class:`Image` or list): The image that has been pulled.
|
||||||
|
If no ``tag`` was specified, the method will return a list
|
||||||
|
of :py:class:`Image` objects belonging to this repository.
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
:py:class:`docker.errors.APIError`
|
:py:class:`docker.errors.APIError`
|
||||||
|
|
@ -293,10 +298,19 @@ class ImageCollection(Collection):
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
>>> image = client.images.pull('busybox')
|
>>> # Pull the image tagged `latest` in the busybox repo
|
||||||
|
>>> image = client.images.pull('busybox:latest')
|
||||||
|
|
||||||
|
>>> # Pull all tags in the busybox repo
|
||||||
|
>>> images = client.images.pull('busybox')
|
||||||
"""
|
"""
|
||||||
|
if not tag:
|
||||||
|
name, tag = parse_repository_tag(name)
|
||||||
|
|
||||||
self.client.api.pull(name, tag=tag, **kwargs)
|
self.client.api.pull(name, tag=tag, **kwargs)
|
||||||
return self.get('{0}:{1}'.format(name, tag) if tag else name)
|
if tag:
|
||||||
|
return self.get('{0}:{1}'.format(name, tag))
|
||||||
|
return self.list(name)
|
||||||
|
|
||||||
def push(self, repository, tag=None, **kwargs):
|
def push(self, repository, tag=None, **kwargs):
|
||||||
return self.client.api.push(repository, tag=tag, **kwargs)
|
return self.client.api.push(repository, tag=tag, **kwargs)
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,12 @@ class ImageCollectionTest(BaseIntegrationTest):
|
||||||
image = client.images.pull('alpine', tag='3.3')
|
image = client.images.pull('alpine', tag='3.3')
|
||||||
assert 'alpine:3.3' in image.attrs['RepoTags']
|
assert 'alpine:3.3' in image.attrs['RepoTags']
|
||||||
|
|
||||||
|
def test_pull_multiple(self):
|
||||||
|
client = docker.from_env(version=TEST_API_VERSION)
|
||||||
|
images = client.images.pull('hello-world')
|
||||||
|
assert len(images) == 1
|
||||||
|
assert 'hello-world:latest' in images[0].attrs['RepoTags']
|
||||||
|
|
||||||
def test_load_error(self):
|
def test_load_error(self):
|
||||||
client = docker.from_env(version=TEST_API_VERSION)
|
client = docker.from_env(version=TEST_API_VERSION)
|
||||||
with pytest.raises(docker.errors.ImageLoadError):
|
with pytest.raises(docker.errors.ImageLoadError):
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import docker
|
import docker
|
||||||
|
import pytest
|
||||||
|
|
||||||
from .. import helpers
|
from .. import helpers
|
||||||
from .base import TEST_API_VERSION
|
from .base import TEST_API_VERSION
|
||||||
from docker.errors import InvalidArgument
|
from docker.errors import InvalidArgument
|
||||||
from docker.types.services import ServiceMode
|
from docker.types.services import ServiceMode
|
||||||
import pytest
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceTest(unittest.TestCase):
|
class ServiceTest(unittest.TestCase):
|
||||||
|
|
@ -182,6 +182,7 @@ class ServiceTest(unittest.TestCase):
|
||||||
service.reload()
|
service.reload()
|
||||||
assert not service.attrs['Spec'].get('Labels')
|
assert not service.attrs['Spec'].get('Labels')
|
||||||
|
|
||||||
|
@pytest.mark.xfail(reason='Flaky test')
|
||||||
def test_update_retains_networks(self):
|
def test_update_retains_networks(self):
|
||||||
client = docker.from_env(version=TEST_API_VERSION)
|
client = docker.from_env(version=TEST_API_VERSION)
|
||||||
network_name = helpers.random_name()
|
network_name = helpers.random_name()
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,22 @@ class ImageCollectionTest(unittest.TestCase):
|
||||||
|
|
||||||
def test_pull(self):
|
def test_pull(self):
|
||||||
client = make_fake_client()
|
client = make_fake_client()
|
||||||
image = client.images.pull('test_image')
|
image = client.images.pull('test_image:latest')
|
||||||
|
client.api.pull.assert_called_with('test_image', tag='latest')
|
||||||
|
client.api.inspect_image.assert_called_with('test_image:latest')
|
||||||
|
assert isinstance(image, Image)
|
||||||
|
assert image.id == FAKE_IMAGE_ID
|
||||||
|
|
||||||
|
def test_pull_multiple(self):
|
||||||
|
client = make_fake_client()
|
||||||
|
images = client.images.pull('test_image')
|
||||||
client.api.pull.assert_called_with('test_image', tag=None)
|
client.api.pull.assert_called_with('test_image', tag=None)
|
||||||
client.api.inspect_image.assert_called_with('test_image')
|
client.api.images.assert_called_with(
|
||||||
|
all=False, name='test_image', filters=None
|
||||||
|
)
|
||||||
|
client.api.inspect_image.assert_called_with(FAKE_IMAGE_ID)
|
||||||
|
assert len(images) == 1
|
||||||
|
image = images[0]
|
||||||
assert isinstance(image, Image)
|
assert isinstance(image, Image)
|
||||||
assert image.id == FAKE_IMAGE_ID
|
assert image.id == FAKE_IMAGE_ID
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue