summaryrefslogtreecommitdiff
path: root/client/image_push.go
diff options
context:
space:
mode:
authorSebastiaan van Stijn <github@gone.nl>2019-12-10 12:24:14 +0100
committerSebastiaan van Stijn <github@gone.nl>2019-12-10 12:24:14 +0100
commitd135dc242e0e138587292bfb6cc28a1899e06a96 (patch)
tree2d0810026e3a806dfa794f8ae8f6580f9620e538 /client/image_push.go
parent2d467dc8d00790da8f4f8d1c0ab3ed7811b7958f (diff)
downloaddocker-d135dc242e0e138587292bfb6cc28a1899e06a96.tar.gz
client.ImagePush(): default to ":latest" instead of "all tags"
The `docker push` command up until docker v0.9.1 always pushed all tags of a given image, so `docker push foo/bar` would push (e.g.) all of `foo/bar:latest`, `foo:/bar:v1`, and `foo/bar:v1.0.0`. Pushing all tags of an image was not desirable in many case, so docker v0.10.0 enhanced `docker push` to optionally specify a tag to push (`docker push foo/bar:v1`) (see issue 3411 and PR 4948 (commit e648a186d68dcb3ee0d6123b041c5aa66438cc89). This behavior exists up until today, and is confusing, because unlike other commands, `docker push` does not default to use the `:latest` tag when omitted, but instead makes it push "all tags of the image". `docker pull` had a similar behavior, but PR 7759 (9c08364a412a51c80e8d17ae14f92549dc543e68) changed the behavior to default to the `:latest` tag, and added a `--all-tags` flag to the CLI to optionally pull all images. This patch implements the API client changes to make `docker push` match the behavior of `docker pull`, and default to pull a single image, unless the `all` option is passed. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Diffstat (limited to 'client/image_push.go')
-rw-r--r--client/image_push.go13
1 files changed, 6 insertions, 7 deletions
diff --git a/client/image_push.go b/client/image_push.go
index 49d412ee37..845580d4a4 100644
--- a/client/image_push.go
+++ b/client/image_push.go
@@ -25,15 +25,14 @@ func (cli *Client) ImagePush(ctx context.Context, image string, options types.Im
return nil, errors.New("cannot push a digest reference")
}
- tag := ""
name := reference.FamiliarName(ref)
-
- if nameTaggedRef, isNamedTagged := ref.(reference.NamedTagged); isNamedTagged {
- tag = nameTaggedRef.Tag()
- }
-
query := url.Values{}
- query.Set("tag", tag)
+ if !options.All {
+ ref = reference.TagNameOnly(ref)
+ if tagged, ok := ref.(reference.Tagged); ok {
+ query.Set("tag", tagged.Tag())
+ }
+ }
resp, err := cli.tryImagePush(ctx, name, query, options.RegistryAuth)
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {