Unverified Kaydet (Commit) 2e8f1f79 authored tarafından Joffrey F's avatar Joffrey F Kaydeden (comit) GitHub

Merge pull request #1883 from docker/1761-dockerclient-pull

Properly support pulling all tags in DockerClient.images.pull
...@@ -5,6 +5,7 @@ import six ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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):
......
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): ...@@ -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): ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment