diff --git a/README.md b/README.md index ba06c86f..442123b5 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ c.pull(repository, tag=None, stream=False) Identical to the `docker pull` command. ```python -c.push(repository, stream=False) +c.push(repository, tag=None, stream=False) ``` Identical to the `docker push` command. diff --git a/docker/client.py b/docker/client.py index d8267273..c4871a69 100644 --- a/docker/client.py +++ b/docker/client.py @@ -747,9 +747,14 @@ class Client(requests.Session): else: return self._result(response) - def push(self, repository, stream=False): + def push(self, repository, tag=None, stream=False): + if not tag: + repository, tag = utils.parse_repository_tag(repository) registry, repo_name = auth.resolve_repository_name(repository) u = self._url("/images/{0}/push".format(repository)) + params = { + 'tag': tag + } headers = {} if utils.compare_version('1.5', self._version) >= 0: @@ -765,9 +770,10 @@ class Client(requests.Session): if authcfg: headers['X-Registry-Auth'] = auth.encode_header(authcfg) - response = self._post_json(u, None, headers=headers, stream=stream) + response = self._post_json(u, None, headers=headers, + stream=stream, params=params) else: - response = self._post_json(u, None, stream=stream) + response = self._post_json(u, None, stream=stream, params=params) return stream and self._stream_helper(response) \ or self._result(response) diff --git a/tests/test.py b/tests/test.py index 5b21a817..4fced935 100644 --- a/tests/test.py +++ b/tests/test.py @@ -1306,6 +1306,30 @@ class DockerClientTest(Cleanup, unittest.TestCase): fake_request.assert_called_with( url_prefix + 'images/test_image/push', + params={ + 'tag': None + }, + data='{}', + headers={'Content-Type': 'application/json'}, + stream=False, + timeout=docker.client.DEFAULT_TIMEOUT_SECONDS + ) + + def test_push_image_with_tag(self): + try: + with mock.patch('docker.auth.auth.resolve_authconfig', + fake_resolve_authconfig): + self.client.push( + fake_api.FAKE_IMAGE_NAME, tag=fake_api.FAKE_TAG_NAME + ) + except Exception as e: + self.fail('Command should not raise exception: {0}'.format(e)) + + fake_request.assert_called_with( + url_prefix + 'images/test_image/push', + params={ + 'tag': fake_api.FAKE_TAG_NAME, + }, data='{}', headers={'Content-Type': 'application/json'}, stream=False, @@ -1322,6 +1346,9 @@ class DockerClientTest(Cleanup, unittest.TestCase): fake_request.assert_called_with( url_prefix + 'images/test_image/push', + params={ + 'tag': None + }, data='{}', headers={'Content-Type': 'application/json'}, stream=True,