DockerCLI/cli/command/image
Sebastiaan van Stijn 9e620e990f
implement docker push -a/--all-tags
The `docker push` command up until [v0.9.1](https://github.com/moby/moby/blob/v0.9.1/api/client.go#L998)
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`, `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 https://github.com/moby/moby/issues/3411 and the pull request that implemented
this: https://github.com/moby/moby/pull/4948).

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"

For example, in the following situation;

```
docker images

REPOSITORY          TAG                        IMAGE ID            CREATED             SIZE
thajeztah/myimage   latest                     b534869c81f0        41 hours ago        1.22MB
```

Running `docker push thajeztah/myimage` seemingly does the expected behavior (it
pushes `thajeztah/myimage:latest` to Docker Hub), however, it does not so for the
reason expected (`:latest` being the default tag), but because `:latest` happens
to be the only tag present for the `thajeztah/myimage` image.

If another tag exists for the image:

```
docker images

REPOSITORY          TAG                        IMAGE ID            CREATED             SIZE
thajeztah/myimage   latest                     b534869c81f0        41 hours ago        1.22MB
thajeztah/myimage   v1.0.0                     b534869c81f0        41 hours ago        1.22MB
```

Running the same command (`docker push thajeztah/myimage`) will push _both_ images
to Docker Hub.

> Note that the behavior described above is currently not (clearly) documented;
> the `docker push` reference documentation (https://docs.docker.com/engine/reference/commandline/push/)
does not mention that omitting the tag will push all tags

This patch changes the default behavior, and if no tag is specified, `:latest` is
assumed. To push _all_ tags, a new flag (`-a` / `--all-tags`) is added, similar
to the flag that's present on `docker pull`.

With this change:

- `docker push myname/myimage` will be the equivalent of `docker push myname/myimage:latest`
- to push all images, the user needs to set a flag (`--all-tags`), so `docker push --all-tags myname/myimage:latest`

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2020-01-28 16:21:06 +01:00
..
build cli: remove unnecessary newlines (whitespace) 2019-10-31 19:22:36 +01:00
testdata fix(pull_test): for quiet option 2019-08-27 18:23:24 +09:00
build.go cli/command/image: SA1006: printf-style with no further arguments (staticcheck) 2019-10-31 19:22:29 +01:00
build_buildkit.go cli/command: fix formatting of comments, and minor linting issues 2020-01-16 12:47:12 +01:00
build_session.go cli/command/image/build_session.go:133:45: getBuildSharedKey - result 1 (error) is always nil (unparam) 2019-10-31 19:22:18 +01:00
build_test.go Extract streams helpers from command package to their own package to remove a cyclic dependency from command to internal/containerizedengine 2019-01-28 14:36:00 +01:00
client_test.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
cmd.go Move credential getting functions to the ConfigFile. 2017-06-27 13:46:47 +02:00
formatter_history.go formatter package heavy refactoring 2018-10-23 17:05:44 +02:00
formatter_history_test.go formatter package heavy refactoring 2018-10-23 17:05:44 +02:00
history.go formatter package heavy refactoring 2018-10-23 17:05:44 +02:00
history_test.go Update tests to use gotest.tools 👼 2018-06-08 18:24:26 +02:00
import.go LCOW: --platform on import (already in API) 2018-09-13 15:04:04 -07:00
import_test.go Update tests to use gotest.tools 👼 2018-06-08 18:24:26 +02:00
inspect.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
inspect_test.go Update tests to use gotest.tools 👼 2018-06-08 18:24:26 +02:00
list.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
list_test.go Update tests to use gotest.tools 👼 2018-06-08 18:24:26 +02:00
load.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
load_test.go Update tests to use gotest.tools 👼 2018-06-08 18:24:26 +02:00
prune.go prune: use filters.Args.Clone() 2018-12-10 16:48:59 +00:00
prune_test.go Fix panic when pruning images with label-filter 2018-12-07 17:56:31 +01:00
pull.go Add option to pull images quietly 2018-12-19 13:48:41 +01:00
pull_test.go fix(pull_test): for quiet option 2019-08-27 18:23:24 +09:00
push.go implement docker push -a/--all-tags 2020-01-28 16:21:06 +01:00
push_test.go Add support for docker push --quiet 2019-11-12 09:48:04 -08:00
remove.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
remove_test.go Update tests to use gotest.tools 👼 2018-06-08 18:24:26 +02:00
save.go Prevent overwriting irregular files (cp, save, export commands) 2019-02-07 09:17:35 +01:00
save_test.go Prevent overwriting irregular files (cp, save, export commands) 2019-02-07 09:17:35 +01:00
tag.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
tag_test.go Update tests to use gotest.tools 👼 2018-06-08 18:24:26 +02:00
trust.go implement docker push -a/--all-tags 2020-01-28 16:21:06 +01:00
trust_test.go Update tests to use gotest.tools 👼 2018-06-08 18:24:26 +02:00